2011-11-02 59 views
3

我有这段代码,我用它来引发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事件。我喜欢这个想法,因为以这种方式编写代码将有助于非常轻松地更改该属性的名称。

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

+0

你想传递调用类或其他类的属性吗? –

+0

[使用表达式树读取属性的名称和值的可能重复。有没有替代?](http://stackoverflow.com/questions/1835527/using-an-expression-tree-to-read-the-name-and-value-of-a-property-is-therean -一个) – nawfal

回答

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); 

虽然(反射/表达确实会增加开销 - 无论是显着取决于上下文),它取决于它需要多少效率。

0

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