使用Reflection获取变量的名称

时间:2009-12-04 17:25:31

标签: c# reflection

我正在使用MVVM,在我的一个虚拟机中,我有一个IsEditable属性(它们都来自基类),一系列按钮使用它来确定它们的命令是否可以触发。 / p>

此虚拟机还有一个子虚拟机,我需要将此IsEditable属性回显到该虚拟机,目前我正在覆盖我的OnPropertyChanged方法,以检查正在刷新的属性是否为{{1} }。

我有一个唠叨,告诉我这不是一个很好的做法,如果将来重命名这个.Equals("IsEditable"),那么这个功能将会默默地破坏。有没有更好的方法来执行此操作,或者能够将属性名称与反射一起使用,例如:

IsEditable

3 个答案:

答案 0 :(得分:3)

您可能会使用与人们用来实现INotifyPropertyChanged的表达式相同的技巧。 Eric De Carufel blogged about this

如果您使用相同的技术,您可以将代码编写为:

if (IsPropertyName(() => this.IsEditable, propertyRefreshName))
{ ... }

这只需要实现一个函数来检查属性名称,但是让你以不使用硬编码字符串的方式进行。

答案 1 :(得分:1)

尝试使用扩展方法从对象中获取属性名称

public static class ObjectExtensions
{
    public static string PropertyName<T,TOut>(this T source, Expression<Func<T,TOut>> property)
    {
        var memberExpression = (MemberExpression) property.Body;
        return memberExpression.Member.Name;
    }
}

然后在你的OnPropertyChanged添加

if(propertyRefreshName == this.PropertyName(x => x.IsEditable))
  SubVM.IsEditable = IsEditable;

答案 2 :(得分:0)

我同意statenjason。

除非我弄错了,根据我自己的经验,我了解到表达式树的主体并不总是一个MemberExpression(它实际上可以是任何东西)所以需要更多的代码。

请参阅FluentNHibernate项目中以下代码中的 GetMemberExpression 方法:

http://github.com/jagregory/fluent-nhibernate/blob/master/src/FluentNHibernate/Utils/Reflection/ReflectionHelper.cs