我知道typeof(T) == typeof(T)
永远是真的,因为Type
对象基本上是静态的,每个类型只存在一个Type
实例(如果这是错误的,请纠正我......我有几个程序可以根据这个假设运行。)
我很难在文档中找到PropertyInfo
个对象是否展示相同的属性。
我的申请是:
我有一个Reflector<T>
类,它取结果typeof(T).GetProperties(...)
并将生成的PropertyInfo
个对象存储为字典中的键。
另外,我有一个表达式解析器,它试图解析一个描述类型Func<T, TResult>
的某个属性的访问的表达式(例如t => t.SomeProperty
,T
为t.GetType()
并且TResult
是SomeProperty
的类型。经过一些计算后,我最终从传递的PropertyInfo
中获得MemberExpression.Member
来自Expression
的对象。
结果PropertyInfo
随后被用作Dictionary.TryGetValue
调用中的关键字,以获取有关存储在Reflector<T>
字典中的属性的其他数据。
问题
我可以放心,来自PropertyInfo
的{{1}}将等于(MemberExpression.Member
)==
来自PropertyInfo
的同一属性或者可能有两个不同的Type.GetProperties
实例,实际上是指相同类型的相同属性?
出于讨论的目的,可以假设该属性是非虚拟的,或者如果它是虚拟的,则不被覆盖。
答案 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;
}
不同。