学习Windows Phone程序开发已经很长时间,对于MVVM也算比较熟悉了。最近自己打算写一写MVVM深入一点的东西,顺利的实现了Model和ViewModel注册的代码。回头一用,突然看到我要通知界面属性的改变是要通过封装PropertyChanged事件中传入字符串的属性名称。这样每个属性修改,我就得修改我的属性名字符串,这样岂不是很不方便?但在MVVM Light中,可以通过在表达式树中传入要使用的属性名的属性调用即可,不由大为震动。
后来多方查证,以下代码可以实现获取一个属性的属性名称字符串:
public string GetPropertyName(Expression<Func<Test, int>> expr)
{
return ((MemberExpression)expr.Body).Member.Name;
}
假设需要获取的属性的名称是Age,可以通过如下方式获取到Age的字符串名称即“Age”:
Console.WriteLine(GetPropertyName(o => o.Age));
这里的o是表达式中的对象。这句代码会输出字符串“Age”到控制台上面。
但是如果属性的数据类型不是int类型,使用上面的GetPropertyName方法就不灵光了。亏得在写Model和ViewModel的注册模块代码时已经仔细研究过泛型,正好在这里也用上,于是最终完整版本的方法出现在了下面:
public string GetPropertyName<T>(Expression<Func<Test, T>> expr)
{
return ((MemberExpression)expr.Body).Member.Name;
}
这样不论属性的返回类型是什么,都可以获取到属性的字符串名称了。