2011-11-02 2 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)); 
      } 
     } 
    } 

와 나는이 방법으로 호출하고 다음 isReady 상태 속성에 대한하여 PropertyChanged 이벤트를 발생합니다

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

. 나는이 방법으로 코드를 작성하는 것이 속성 이름을 매우 쉽게 변경하는 데 도움이 될 것이라는 생각을 좋아합니다.

이제 동일한 기술을 사용하여 속성의 이름과 값을 메서드에 전달하고 싶습니다. 내가 할 수있는 방법이 있니?

+0

호출 클래스 또는 다른 클래스의 속성을 전달 하시겠습니까? –

+0

[식 트리를 사용하여 속성의 이름과 값을 읽을 수 있습니다. 거기에 대안이 있습니까?] (http://stackoverflow.com/questions/1835527/using-an-expression-tree-to-read-the-name-and-value-of-a-property-is-there-an -에이) – nawfal

답변

4

당신은 이미 그것을 가지고 :

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

대안은 각각 PropertyInfo 또는 FieldInfo에 캐스팅 member.MemberType,보고 될 것이다 : 그러나

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)을 사용할 수 있습니다.

관련 문제