如何通过反射识别抽象成员

时间:2009-06-22 06:58:11

标签: c# reflection

考虑到以下课程 - 我想知道这两个成员中哪一个是抽象的:

abstract class Test
{
  public abstract bool Abstract { get; set; }
  public bool NonAbstract { get; set; }
}

var type = typeof( Test );
var abs = type.GetProperty( "Abstract" );
var nonAbs = type.GetProperty( "NonAbstract" );

// now, something like:
if( abs.IsAbstract ) ...

不幸的是,IsAbstract - 属性没有 我需要选择一个类的所有非抽象字段/属性/方法 - 但是也没有BindingFlags来缩小选择范围。

2 个答案:

答案 0 :(得分:12)

属性实际上是一些“语法糖”,由两种方法实现:getter方法和setter方法。

所以,我认为你应该能够通过检查getter和/或setter是否是抽象的来确定属性是否是抽象的,如下所示:

PropertyInfo pi = ...

if( pi.GetSetMethod().IsAbstract )
{
}

而且,AFAIK,一个领域不能抽象。 ;)

答案 1 :(得分:1)

首先:字段不能是抽象的,因为它们都是字段本身。

接下来我们注意到属性(在一个松散的意义上!)实际上是get_ / set_方法。

接下来,我们检查 具有IsAbstract属性的内容,并查看MethodBase(以及MethodInfo}的内容。

最后,我们记住/了解/发现PropertyInfoGetGetMethod()GetSetMethod()方法返回MethodInfo,我们已经完成了,除了填写关于继承的混乱细节等等。