我的班级中有一个公共财产,当给出以下标志时,我应该如何标记它(某些属性)以被忽略
BindingFlags.DeclaredOnly |
BindingFlags.Instance |
BindingFlags.NonPublic |
BindingFlags.Public
我需要使用带有参数的 dll 方法:对象和绑定标志,所以我需要以某种方式标记我的属性以被此方法忽略
我的班级中有一个公共财产,当给出以下标志时,我应该如何标记它(某些属性)以被忽略
BindingFlags.DeclaredOnly |
BindingFlags.Instance |
BindingFlags.NonPublic |
BindingFlags.Public
我需要使用带有参数的 dll 方法:对象和绑定标志,所以我需要以某种方式标记我的属性以被此方法忽略
我认为您混淆了 BindingFlags 和 CustomAttributes 的角色。BindingFlags 根据它们是否是 、 等来查找private
事物static
。
如果您想忽略消费代码中的某个属性,您需要更改该消费代码以忽略具有与其关联的特定自定义属性的属性。
如果您无权访问使用代码,则没有任何方法可以让它看不到那里的属性。不过,根据代码的编写方式,可能会有一些解决方法。例如,如果代码基于特定类型参数进行搜索,您可以创建一个抽象基类来容纳您希望它关心的所有属性,然后为您的实际实现扩展该类,为您的应用添加一些额外的属性方便。
或者,您可以创建一个 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
and Y
。如果您的 dll/实用程序采用类型,那么我们可以制作Foo
derived 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
在通话期间忽略它的唯一方法是使用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
。