首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何覆盖System.Type.GetProperties()?

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

Stack Overflow用户
提问于 2015-03-10 21:19:18
回答 1查看 1.4K关注 0票数 0

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

代码语言:javascript
复制
class A
{
    public int PropertyOne { get; set; }
    public int PropertyTwo { get; set; }
}

如果我打这个电话

代码语言:javascript
复制
var myProperties = typeof(A).GetProperties();

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

我试图创建一个从抽象System.Type派生的类型,并在派生类中重写GetProperties()。但是,我总是得到一个编译时错误:

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

如何克服此错误并成功重写GetProperties()

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-10 23:41:03

您正确地注意到System.Type是抽象的,理论上您可以从它派生并覆盖它的抽象或虚拟方法。然而,在实践中,您几乎肯定不应该这样做。.NET运行时会根据需要这样做。

在C# (相对于Java)中,默认情况下方法不是虚拟的。您只能覆盖显式标记virtualabstractoverride的方法,正如编译器错误说明的那样。在这种情况下,您可以重写GetProperties(BindingFlags attr),因为它是一个抽象方法。但是,重写该方法不太可能解决您的问题,而且您的重写方法无论如何也无法从typeof(A).GetProperties(BindingFlags attr)中获得。

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

  1. 转而调用GetProperty的重载之一。例如,typeof(A).GetProperty("PropertyOne")将返回对应于A.PropertyOnePropertyInfo对象。
  2. 如果没有一个GetProperty重载满足您的需要,那么像以前一样调用GetProperties(),然后过滤结果。普通的Linq方法可用于GetProperties()返回的GetProperties()数组。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28974283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档