如何在使用反射时忽略属性

时间:2012-04-12 20:19:07

标签: c# reflection

我的课程中有一个公共属性,当给出以下标记时,我应该如何标记它(某些属性)

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

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

5 个答案:

答案 0 :(得分:3)

我认为你混淆了BindingFlags和CustomAttributes的角色。 BindingFlags根据它们是privatestatic等来查找内容。

如果您想忽略消费代码中的某个属性,则需要更改该消费代码,以忽略与其关联的特定自定义属性的属性。

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

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

答案 1 :(得分:0)

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

class Foo
{
  public static int Bar { get; set; }
}

编辑您已声明不想更改行为。你的dll是拿一个对象还是一个类型?如果是类型,您可以使用继承来“隐藏”此方法的属性。

说你现在有:

class Foo
{
  public int X {get;set;}
  public int Y {get;set;}
}

您的代码希望Foo拥有XY。如果您的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

答案 2 :(得分:0)

在通话期间忽略它的唯一方法是使用Type.FindMembers,但这可能需要更多的工作,而不仅仅是过滤它。

答案 3 :(得分:0)

我认为自定义属性在这里是合适的。使用属性装饰您要忽略的成员,并包装您正在使用的代码,以检查将清除装饰项目的例程中的属性。

答案 4 :(得分:0)

您可以使用简单的扩展方法执行此操作:

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就可以了。