如何覆盖System.Type.GetProperties()?

时间:2015-03-10 21:19:19

标签: .net reflection

我想覆盖System.Type.GetProperties()方法只返回一个特定属性,具体取决于运行时确定的逻辑。例如,如果我有这个类:

class A
{
    public int PropertyOne { get; set; }
    public int PropertyTwo { get; set; }
}

如果我打这个电话:

var myProperties = typeof(A).GetProperties();

我希望myProperties只包含一个PropertyInfo对象。此对象将包含有关A.PropertyOneA.PropertyTwo的信息,但不包含两者,具体取决于运行时逻辑。

我尝试创建一个派生自抽象System.Type的类型,并在派生类中覆盖GetProperties()。但是,我总是遇到编译时错误:

  

' MyNamespace.MyClass.GetProperties()':无法覆盖继承的成员' System.Type.GetProperties()'因为它没有标记为虚拟,抽象或覆盖

如何克服此错误并成功覆盖GetProperties()

1 个答案:

答案 0 :(得分:2)

你是正确的指出System.Type是抽象的,理论上,你可以从它派生并覆盖它的抽象或虚拟方法。但是,在实践中,你几乎肯定不应该这样做。 .NET运行时会根据需要执行此操作。

在C#中(与Java相反),默认情况下,方法不是虚拟的。您只能覆盖显式标记为virtualabstractoverride的方法,就像编译器错误所述。在这种情况下,可以覆盖GetProperties(BindingFlags attr),因为它是一种抽象方法。但是,覆盖该方法不太可能解决您的问题,并且无论如何都无法从typeof(A).GetProperties(BindingFlags attr)获得您的覆盖方法。

您可能会发现其中一种方法更有用:

  1. 改为调用GetProperty的其中一个重载。例如,typeof(A).GetProperty("PropertyOne")将返回与PropertyInfo对应的A.PropertyOne对象。
  2. 如果GetProperty重载都没有满足您的需求,请按照您之前尝试的方式调用GetProperties(),然后过滤结果。正常的Linq方法可在PropertyInfo返回的GetProperties()数组中使用。