我想获取特定属性的PropertyInfo.我可以用:
foreach(PropertyInfo p in typeof(MyObject).GetProperties())
{
if ( p.Name == "MyProperty") { return p }
}
Run Code Online (Sandbox Code Playgroud)
但必须有办法做类似的事情
typeof(MyProperty) as PropertyInfo
Run Code Online (Sandbox Code Playgroud)
在那儿?还是我坚持做一个类型不安全的字符串比较?
干杯.
public string GetCorrectPropertyName<T>(Expression<Func<T, string>> expression)
{
return ((MemberExpression)expression.Body).Member.Name; // Failure Point
}
Run Code Online (Sandbox Code Playgroud)
并称之为
string lcl_name = false;
public string Name
{
get { return lcl_name ; }
set
{
lcl_name = value;
OnPropertyChanged(GetCorrectPropertyName<ThisClassName>(x => x.Name));
}
}
Run Code Online (Sandbox Code Playgroud)
如果property是string,并且所有其他类型都提供此异常,则此方法正常:
无法将类型为"System.Linq.Expressions.UnaryExpression"的对象强制转换为"System.Linq.Expressions.MemberExpression".
x => x.PropertyName到x => Convert.ToString(x.PropertyName),它仍然失败我哪里错了?
我遇到了一个我没想到的问题.一个例子可能比一段更好地说明我的问题:
更新:跳转到最后一个代码块,以获得更有说服力的代码示例.
public class A
{
public string B { get; set; }
}
public class C : A { }
Run Code Online (Sandbox Code Playgroud)
以下是方法中的一些代码:
var a = typeof(C).GetMember("B")[0];
var b = typeof(A).GetMember("B")[0];
Expression<Func<C, string>> c = x => x.B;
var d = (c.Body as MemberExpression).Member;
Run Code Online (Sandbox Code Playgroud)
以下是一些比较的结果:
a == b //false
a == d //false
b == d //true
Run Code Online (Sandbox Code Playgroud)
前两个有些出乎意料.我知道即使B不是虚拟的,C也可以用w new运算符定义一个具有相同名称的属性,但在这种情况下我没有.
第二个对我来说真是最让人惊讶的(也是我问题的核心).即使lambda的参数明确定义为C类,它仍然返回它,就像从基类访问属性一样.
我正在寻找的是一种从lambda表达式获取MemberInfo的方法,就好像我已经使用参数类型的反射来获取MemberInfo.我的项目本质上将MemberInfos存储在各种字典中,它需要具有可以通过提供lambda表达式来访问元素的功能.
重复的代码示例由Danny Chen提供
public class Base
{
public string Name { get; set; }
}
public class Derived : Base …Run Code Online (Sandbox Code Playgroud)