我在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
没有提供IsStatic
,IsPrivate
,...属性。看起来这些属性仅在ConstructorInfo
,FieldInfo
,MethodInfo
中定义,但在(基础)MemberInfo
,PropertyInfo
和EventInfo
中缺失
有什么我想念的吗?如何过滤MemberInfo
和PropertyInfo
答案 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);