Как определить абстрактных членов с помощью рефлексии - PullRequest
5 голосов
/ 22 июня 2009

Учитывая следующий класс - я хотел бы знать, какой из обоих членов является абстрактным:

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 ]

12 голосов
/ 22 июня 2009

Свойство на самом деле представляет собой некоторый «синтаксический сахар» и реализуется двумя методами: методом получения и методом установки.

Итак, я думаю, что вы должны быть в состоянии определить, является ли свойство абстрактным, проверив, являются ли методы получения и / или установки абстрактными, например:

PropertyInfo pi = ...

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

И, AFAIK, поле не может быть абстрактным. ;)

1 голос
/ 22 июня 2009

Прежде всего: поля не могут быть абстрактными, поскольку все, что им нужно, это само поле.

Далее отметим, что свойства (в широком смысле!) На самом деле являются методами get_ / set_ под капотом.

Затем мы проверяем, что имеет имеет свойство IsAbstract, и видим, что MethodBase (и так MethodInfo) имеет.

Наконец, мы помним / знаем / выясняем, что PropertyInfo имеет GetGetMethod() и GetSetMethod() методы, которые возвращают MethodInfo с, и мы закончили, за исключением заполнения беспорядочных деталей о наследовании и т. Д. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...