过滤掉.NET 4.5 TypeInfo.DeclaredMembers上的私有成员

时间:2014-01-15 09:29:11

标签: c# portable-class-library system.reflection

我在PCL项目中使用反射(4.5,配置文件78)。反射api在4.5中发生了变化(参见Evolving the reflection API),虽然这种变化在经典框架中几乎不可察觉(TypeInfo继承自Type),但对于其他配置文件来说却是另一回事,包括PCL

在.NET 4中,这将检索所有公共成员:

typeof(MyType).GetMembers ();

.NET 4.5中的粗略等价物是

typeof (MyType).GetTypeInfo ().DeclaredMembers;

除了它返回所有成员。 doc

  

要过滤DeclaredMembers属性的结果,请使用LINQ查询。

好。我想,但是MemberInfo没有提供IsStaticIsPrivate,...属性。看起来这些属性仅在ConstructorInfoFieldInfoMethodInfo中定义,但在(基础)MemberInfoPropertyInfoEventInfo中缺失

有什么我想念的吗?如何过滤MemberInfoPropertyInfo

2 个答案:

答案 0 :(得分:1)

检索PropertyInfo上的辅助功能访问者的一种方法是

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

同样适用于EventInfo AddMethod

这一切都是有道理的,因为财产本身不是公共的或私人的,但是有公共或私人的吸气者和制定者。

答案 1 :(得分:0)

GetMembers和DeclaredMembers不相同,DeclaredMembers忽略继承的成员。 您可以使用BindingFlags.DeclaredOnly对GetMembers执行相同的操作,如下所示: GetMembers(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);