C# 使用反射时如何忽略属性

C# 使用反射时如何忽略属性,c#,reflection,C#,Reflection,我的类中有一个公共属性,当给出以下标志时,如何将它(某些属性)标记为忽略 BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public 我需要使用带有参数的dll中的方法:对象和绑定标志,因此我需要以某种方式将我的属性标记为被此方法忽略我认为您混淆了BindingFlags和CustomAttributes的角色。BindingFlags根据事物是否是私有的

我的类中有一个公共属性,当给出以下标志时,如何将它(某些属性)标记为忽略

BindingFlags.DeclaredOnly | 
BindingFlags.Instance | 
BindingFlags.NonPublic | 
BindingFlags.Public

我需要使用带有参数的dll中的方法:对象和绑定标志,因此我需要以某种方式将我的属性标记为被此方法忽略

我认为您混淆了BindingFlags和CustomAttributes的角色。BindingFlags根据事物是否是
私有的
静态的
等来查找

如果要忽略消费代码中的属性,则需要更改该消费代码以忽略具有特定自定义属性的属性

如果您没有访问消费代码的权限,那么没有任何方法可以使它看不到存在的属性。不过,根据代码的编写方式,可能会有一些变通方法。例如,如果代码基于特定的类型参数进行搜索,则可以创建一个抽象基类来容纳希望它关注的所有属性,然后为实际实现扩展该类,为方便起见添加一些额外的属性


或者,您可以创建一个DTO来表示要传递给正在调用的方法的属性,并将适当的属性从原始对象复制到该DTO中。

您的标志将不会返回静态属性

class Foo
{
  public static int Bar { get; set; }
}
编辑您已声明不想更改行为。您的dll采用对象还是类型?如果是类型,则可以使用继承从此方法“隐藏”属性

假设你现在有:

class Foo
{
  public int X {get;set;}
  public int Y {get;set;}
}
您的代码期望
Foo
具有
X
Y
。如果您的dll/实用程序采用类型,那么我们可以使
Foo
派生
Bar
。假设我们不希望实用程序看到“X”,而只看到“Y”

class Bar
{
  public int Y {get;set;}
}

class Foo : Bar
{
  public int X {get;set;}
}
//在公用事业呼叫中

utility.Baz(foo.GetType().BaseType); // <- Base here is Bar, which does not have X

utility.Baz(foo.GetType().BaseType);// 在调用过程中忽略它的唯一方法是使用
Type.FindMembers
,但这可能需要更多的工作,而不仅仅是对其进行后期筛选。

我认为自定义属性在这里是合适的。用属性修饰您希望忽略的成员,并将用于检查属性的代码包装到例程中,该例程将删除修饰的项。

您可以使用一个简单的扩展方法来完成此操作:

public static class ExtensionMethods
{
    public static PropertyInfo[] GetNonPublicProperties(this Type t) {
        return t.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public).Where(prop => prop.GetAccessors(true).Where(mi => mi.IsPublic == false).Count() != 0).ToArray();
    }
}

然后只需使用
Type.GetNonPublicProperties
即可设置。

当您写入属性时,是否可以跳过它?如果您希望用户能够指定何时忽略,我建议您在API中使用参数让用户指定要忽略的属性,或者使用指示应忽略它的自定义属性。或者,你是说答案必须跟在这些标志后面,而且只有这些标志?@Magnus不,因为我使用dll中的方法:dcont你使用自定义属性吗?@kosnkov:什么方法?什么dll?如果他没有以“何时给出以下标志”结束他的问题,我会完全同意。请注意,我对他的问题的评论是针对你提出的这一点的。另外,您好:)考虑到他的旗帜,有一种方法是他的旗帜不会拾取静态。@StriplingWarrior我不确定如何通过反射解析属性,但这不可能将一些字段标记为“反射!我是特殊字段不要看我,继续走”??如果给这个方法所有可能的绑定标志呢?那么,没有其他方法可以忽略一些,然后改变建模???@payo:我得到的印象是,他可能不想改变对象的行为(通过将属性设置为静态)。@kosnkov:不,没有任何方法可以标记一个字段,使其通常被反射忽略。编写使用反射的方法的人必须向您提供一个API,允许您标记该框架忽略的属性。例如,大多数序列化/反序列化框架就是这样做的。