我想重写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()?
发布于 2015-03-10 23:41:03
您正确地注意到System.Type是抽象的,理论上您可以从它派生并覆盖它的抽象或虚拟方法。然而,在实践中,您几乎肯定不应该这样做。.NET运行时会根据需要这样做。
在C# (相对于Java)中,默认情况下方法不是虚拟的。您只能覆盖显式标记virtual、abstract或override的方法,正如编译器错误说明的那样。在这种情况下,您可以重写GetProperties(BindingFlags attr),因为它是一个抽象方法。但是,重写该方法不太可能解决您的问题,而且您的重写方法无论如何也无法从typeof(A).GetProperties(BindingFlags attr)中获得。
您可能会发现其中一种方法更有用:
GetProperty的重载之一。例如,typeof(A).GetProperty("PropertyOne")将返回对应于A.PropertyOne的PropertyInfo对象。GetProperty重载满足您的需要,那么像以前一样调用GetProperties(),然后过滤结果。普通的Linq方法可用于GetProperties()返回的GetProperties()数组。https://stackoverflow.com/questions/28974283
复制相似问题