我想覆盖System.Type.GetProperties()
方法只返回一个特定属性,具体取决于运行时确定的逻辑。例如,如果我有这个类:
class A
{
public int PropertyOne { get; set; }
public int PropertyTwo { get; set; }
}
如果我打这个电话:
var myProperties = typeof(A).GetProperties();
我希望myProperties
只包含一个PropertyInfo
对象。此对象将包含有关A.PropertyOne
或A.PropertyTwo
的信息,但不包含两者,具体取决于运行时逻辑。
我尝试创建一个派生自抽象System.Type
的类型,并在派生类中覆盖GetProperties()
。但是,我总是遇到编译时错误:
' MyNamespace.MyClass.GetProperties()':无法覆盖继承的成员' System.Type.GetProperties()'因为它没有标记为虚拟,抽象或覆盖
如何克服此错误并成功覆盖GetProperties()
?
答案 0 :(得分:2)
你是正确的指出System.Type
是抽象的,理论上,你可以从它派生并覆盖它的抽象或虚拟方法。但是,在实践中,你几乎肯定不应该这样做。 .NET运行时会根据需要执行此操作。
在C#中(与Java相反),默认情况下,方法不是虚拟的。您只能覆盖显式标记为virtual
,abstract
或override
的方法,就像编译器错误所述。在这种情况下,可以覆盖GetProperties(BindingFlags attr)
,因为它是一种抽象方法。但是,覆盖该方法不太可能解决您的问题,并且无论如何都无法从typeof(A).GetProperties(BindingFlags attr)
获得您的覆盖方法。
您可能会发现其中一种方法更有用:
GetProperty
的其中一个重载。例如,typeof(A).GetProperty("PropertyOne")
将返回与PropertyInfo
对应的A.PropertyOne
对象。GetProperty
重载都没有满足您的需求,请按照您之前尝试的方式调用GetProperties()
,然后过滤结果。正常的Linq方法可在PropertyInfo
返回的GetProperties()
数组中使用。