我的课程中有一个公共属性,当给出以下标记时,我应该如何标记它(某些属性)
BindingFlags.DeclaredOnly |
BindingFlags.Instance |
BindingFlags.NonPublic |
BindingFlags.Public
我需要使用dll中带有参数的方法:对象和绑定标志,所以我需要以某种方式标记我的属性以便被此方法忽略
答案 0 :(得分:3)
我认为你混淆了BindingFlags和CustomAttributes的角色。 BindingFlags根据它们是private
,static
等来查找内容。
如果您想忽略消费代码中的某个属性,则需要更改该消费代码,以忽略与其关联的特定自定义属性的属性。
如果您无权访问使用代码,则无法使其看不到存在的属性。但是,根据代码的编写方式,可能会有一些变通方法。例如,如果代码是基于特定类型参数进行搜索,则可以创建一个抽象基类来容纳您希望它关注的所有属性,然后为实际实现扩展该类,为您添加一些额外的属性。便利性。
或者您可以创建一个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
拥有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
答案 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
就可以了。