如何使用反射获取属性的名称和值?

时间:2011-11-02 11:56:10

标签: c# reflection

我有这个代码,我用它来引发PropertyChanged事件而不将属性名称传递给函数。

private void RaisePropertyChanged<TValue>(Expression<Func<TValue>> propertySelector)
    {
        var memberExpression = propertySelector.Body as MemberExpression;
        if (memberExpression != null)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(memberExpression.Member.Name));
            }
        }
    }

我以这种方式称呼它:

  this.RaisePropertyChanged(() => this.IsReady);

这会引发IsReady属性的PropertyChanged事件。我喜欢这个想法,因为以这种方式编写代码将有助于非常容易地更改属性的名称。

现在我想使用相同的技术将属性的名称和值传递给方法。我有什么方法可以做到这一点吗?

2 个答案:

答案 0 :(得分:4)

你已经拥有它:

string name = memberExpression.Member.Name;
TValue value = propertySelector.Compile()();

另一种方法是分别查看member.MemberType,转换为PropertyInfoFieldInfo

var member = memberExpression.Member;
string name = member.Name;
object value;
switch(member.MemberType) {
    case MemberTypes.Field:
       value = ((FieldInfo)member).GetValue(this);
       break;
    case MemberTypes.Property:
       value = ((PropertyInfo)member).GetValue(this, null);
       break;
    default:
       throw new NotSupportedException(member.MemberType.ToString());
}

但是,更简单的方法是......只需将名称和值传递给方法:

Foo("IsReady", IsReady);

它取决于它需要多少效率,但是(反射/表达确实增加了开销 - 是否重要取决于上下文)。

答案 1 :(得分:0)

要获取名称,您可以使用memberExpression.Member.Name并获取可以使用this.GetType().GetProperty (memberExpression.Member.Name).GetGetMethod().Invoke (this, null)的值。