表达式中的PropertyInfo是否等于GetProperties()中的PropertyInfo

时间:2014-10-30 19:19:05

标签: c# reflection types lambda

我知道typeof(T) == typeof(T)永远是真的,因为Type对象基本上是静态的,每个类型只存在一个Type实例(如果这是错误的,请纠正我......我有几个程序可以根据这个假设运行。)

我很难在文档中找到PropertyInfo个对象是否展示相同的属性。

我的申请是:

我有一个Reflector<T>类,它取结果typeof(T).GetProperties(...)并将生成的PropertyInfo个对象存储为字典中的键。

另外,我有一个表达式解析器,它试图解析一个描述类型Func<T, TResult>的某个属性的访问的表达式(例如t => t.SomePropertyTt.GetType()并且TResultSomeProperty的类型。经过一些计算后,我最终从传递的PropertyInfo中获得MemberExpression.Member来自Expression的对象。

结果PropertyInfo随后被用作Dictionary.TryGetValue调用中的关键字,以获取有关存储在Reflector<T>字典中的属性的其他数据。

问题

我可以放心,来自PropertyInfo的{​​{1}}将等于(MemberExpression.Member==来自PropertyInfo的同一属性或者可能有两个不同的Type.GetProperties实例,实际上是指相同类型的相同属性?

出于讨论的目的,可以假设该属性是非虚拟的,或者如果它是虚拟的,则不被覆盖。

2 个答案:

答案 0 :(得分:1)

基于reference source code,它应该是。 PropertyInfo实例是从匹配的Type中获取的。

答案 1 :(得分:1)

无论属性是virtual还是被覆盖,派生类型上的PropertyInfo总是不同于它所定义的基类型上的MemberExpression.Member

使用() => someInstance.SomeProperty形式的lambda中的PropertyInfo时,您可以从派生类型中检索PropertyInfo。正如我在answer over here中发现的那样,它与您从基本类型本身获得的int a=0; StringBuilder str=new StringBuilder(); str.append("*"); while(a<=5){ System.out.println(str); str.append("*"); a=a+1; } 不同。