【发布时间】:2011-03-18 13:56:52
【问题描述】:
我得到了:
一个类“
T”,它实现了用我感兴趣的属性修饰的属性。A
PropertyInfo"p" 表示属于 (1)T实现的接口 "I" 的属性,(2) @987654328 的基类 "B" @ 继承自,或 (3) 类T本身。
即使p 的DeclaringType 是T 实现的接口或T 继承自的类,我也需要获取在T 中的属性上定义(或由其继承)的属性。所以我需要一种方法来从p 到T 上实际存在的PropertyInfo。因此似乎有3种情况:
-
p.DeclaringType == typeof(T)这是一个小例子。我可以遍历
T的属性,直到找到匹配项。示例:return typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) .FirstOrDefault(property => property == p) -
p.DeclaringType == typeof(I)其中I是T实现的接口这更复杂。发现可以使用一个InterfaceMapping在
T中找到p的对应实现。这似乎有点骇人听闻,但这里有什么作用:if (p.DeclaringType.IsInterface && typeof(T).GetInterfaces().Contains(p.DeclaringType)) { InterfaceMapping map = typeof(T).GetInterfaceMap(p.DeclaringType); MethodInfo getMethod = p.GetGetMethod(); for (int i = 0; i < map.InterfaceMethods.Length; i++) { if (map.InterfaceMethods[i] == getMethod) { MethodInfo target = map.TargetMethods[i]; return typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) .FirstOrDefault(property => property.GetGetMethod() == target); } } } -
p.DeclaringType == typeof(B)其中B是T继承自的类我还没有弄清楚如何识别
T上的属性,它覆盖了Ts 基类B中定义的虚拟属性p。
所以我的问题是
- 在案例 3中,我如何在
T上找到覆盖B上的属性p的PropertyInfo? - 有没有更好的方法来完成这三个?也许是一种统一这三种情况的方法。
【问题讨论】:
-
无论你的解决方案最终是什么,不要忘记一个类可以隐藏(或隐藏)一个继承的成员(msdn.microsoft.com/en-us/library/…)这一事实。这可能会影响您的解决方案。
标签: c# .net reflection .net-3.5