2011-09-09 11 views
0

リフレクションを使用して一部のメンバ名を文字列として取得しています。私はon Google Codeを見つけた方法を使用しています(私はそれが使用する反射/ LINQの魔法の強力な把握を持っていない):ジェネリックのメンバ名を型パラメータを知らずに文字列として取得します。

public static class MembersOf<T> { 
    public static string GetName<R>(Expression<Func<T,R>> expr) { 
     var node = expr.Body as MemberExpression; 
     if (object.ReferenceEquals(null, node)) 
      throw new InvalidOperationException("Expression must be of member access"); 
     return node.Member.Name; 
    } 
} 

これは、静的コンストラクタで素晴らしい作品。私はちょうどこのようにそれを使用します。

using ClassMembers = MembersOf<MyClass>; 

class MyClass 
{ 
    public int MyProperty { get; set; } 

    static MyClass 
    { 
     string lMyPropertyName = ClassMembers.GetName(x => x.MyProperty); 
    } 
} 

あなたは文字列リテラルでスペルミスのメンバー名を避けるため、自動リファクタリングツールを使用することができますこの方法で。 INotifyPropertyChangedを実装するといいですね!あなたはジェネリック型パラメータとして、非結合型を使用することはできません

しかし、今、私は同じように使用する一般的なクラスを持っている、とI've learnedは:

using ClassMembers = MembersOf<MyGeneric<>>; 

class MyGeneric<T> { } 

は何に良い方法だろうこの問題を回避するには?

string propName = MembersOf<MyGeneric<T>>.GetName(x => x.SomeProp); 

答えて

1

最良の方法は、usingディレクティブを忘れて、ただクラスを直接使用することです! using ClassMembersエイリアスは明らかに隠れていました。私はちょうど私のクラスでMembersOf<MyGeneric<T>>を直接使用する必要があります!

class MyGeneric<T> 
{ 
    public int MyProperty { get; set; } 

    static MyClass<T> 
    { 
     string lMyPropertyName = MembersOf<MyGeneric<T>>.GetName(x => x.MyProperty); 
    } 
} 
0

D'OH:

関連する問題