Отфильтровать частные члены в .NET 4.5 TypeInfo.DeclaredMembers

Я использую отражение в проекте PCL (4.5, профиль 78). API отражения изменился в версии 4.5 (см. Развитие API отражения), и хотя это изменение едва заметно в классической структуре (где TypeInfo наследуется от Type), это что-то еще для других профилей, включая PCL.

В .NET 4 это приведет к получению всех общедоступных членов:

typeof(MyType).GetMembers ();

The rough equivalent in .NET 4.5 is

typeof (MyType).GetTypeInfo ().DeclaredMembers;

except that it returns all the members. The doc says

Чтобы отфильтровать результаты свойства DeclaredMembers, используйте запросы LINQ.

Хорошо. Я бы хотел, но MemberInfo не предоставляет свойства IsStatic, IsPrivate, .... Похоже, что эти свойства определены только в ConstructorInfo, FieldInfo, MethodInfo, но отсутствуют в (базовых) MemberInfo, PropertyInfo и EventInfo.

Что-то мне не хватает? Как следует фильтровать MemberInfo и PropertyInfo


person Stephane Delcroix    schedule 15.01.2014    source источник


Ответы (2)


Один из способов получить аксессоры специальных возможностей на PropertyInfo -

bool HasPublicGetter (PropertyInfo pi) 
{
    if (!pi.CanRead)
        return false;
    MethodInfo getter = pi.GetMethod;
    return getter.IsPublic;
}

Same applies to EventInfo with AddMethod.

Все это имеет смысл, поскольку свойства не являются общедоступными или частными сами по себе, но имеют общедоступные или частные геттеры и сеттеры.

person Stephane Delcroix    schedule 15.01.2014

GetMembers и DeclaredMembers не одно и то же, DeclaredMembers игнорирует унаследованные члены. Вы можете сделать то же самое с GetMembers, используя BindingFlags.DeclaredOnly, как это: GetMembers (BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);

person Tamir Vered    schedule 04.02.2014
comment
Покажите, пожалуйста, рабочий пример, я не думаю, что простое указание GetMembers(BindingFlags.DeclaredOnly) даст какие-либо результаты. - person Anders Gustafsson; 04.02.2014
comment
GetMembers (BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); - person Tamir Vered; 04.02.2014
comment
Хороший! Извините, если я не совсем понял, я имел в виду, что вам следует обновить ответ, указав эту информацию :-) - person Anders Gustafsson; 04.02.2014