2011-11-15 3 views
16

文字列表現オブジェクトインスタンスプロパティのExpression<Func<T>>で撮影することができます。オブジェクトインスタンスを作成せずにオブジェクトプロパティ名文字列を取得することはできますか?

string propertyName = ((MemberExpression) property.Body).Member.Name; 

しかし、私は持っていない場合は、インスタンスを(作成しない)何?この場合、プロパティ名を取得するにはどうすればよいですか?

は、私はいくつかのオブジェクトのプロパティ名の文字列表現を必要とする

を説明しました。

のエンティティ

public class Customer 
{ 
    public int ID; 
    public string Name; 
} 

今、私はこのように私は、文字列「ID」が必要、他のいくつかの関数にこのエンティティのキ​​ー式を渡したいが、私はハードコーディングしたくないがあるとしましょうSomeOtherFunction("ID")のような文字列ではなく、代わりに式SomeOtherFunction(ExpressionReader.GetString(() => CustomerInstance.ID))を使用します。これが機能するには、エンティティインスタンスを提供する必要があります。

今、私は同じインスタンスの作成なしで実行したいと思います。

+0

インスタンス」とはどういう意味ですか"?プロパティを公開するクラスのインスタンスを作成する必要はありませんが、明らかに 'Expression 'のインスタンスが必要です。 – CodesInChaos

+0

あなたはtypeof(myClass).GetProperty( "abc")を認識していますか? – Efrain

+0

IDプロパティのハードコードと "ID"文字列の違いは何ですか? – SWeko

答えて

15

これは、次のようなメソッドのシグネチャを持つことも可能である:

private static string GetPropertyName<TModel, TProperty>(Expression<Func<TModel, TProperty>> property) 
{ 
    MemberExpression memberExpression = (MemberExpression)property.Body; 

    return memberExpression.Member.Name; 
} 

あなたは顧客クラスのインスタンスなしに、このメソッドを呼び出すことができます。もちろん

string propertyName = GetPropertyName((Customer c) => c.ID); 

をあなたのためにいくつかのチェックを追加する必要がありますMemberExpressionにキャストしてmemberExpression.Member.Nameにアクセスする前に正しい式の種類を入力してください。

+0

非常にうまく動作します、ありがとうございます。 –

0

私はあなたが何を意味しているかを十分に理解していませんが、私の理解に基づいてReflectionを使用することができます。あなたは、プロパティ名をから取得するために何を望むかのTypeを持っていた場合、このアプローチを使用して、あなたは使用してプロパティを取得できます。

Type someType = typeof(SomeClass); 

// Get all properties for a type 
PropertyInfo[] properties = someType.GetProperties(); 

// Get a property from a type by it's name 
PropertyInfo property = someType.GetProperty("PropertyName"); 

あなたがPropertyInfoクラスのインスタンス(複数可)を持っていたら、あなたが取得することができますプロパティ名などの情報

この方法の詳細については、MSDN Documentationを参照してください。

+1

これは私が必要とするものではありません。 –

4

いいえ、Expressionを分解するインスタンスは必要ありません。式が1つを期待しても、あなたはそれを呼び出すことはありません。

実際には、最初のコードスニペットと同じように実行します。

あなたはこのように見えるようにあなたのコードを変更します

SomeOtherFunction(ExpressionReader<Customer>.GetString(c => c.ID)) 

んあなたに意味をなさない?また

Customer c = null; // null intentionally 

SomeOtherFunction(ExpressionReader.GetString(() => c.ID)); 

あなたが表現を起動していないとして、それでも問題ありません。

+0

最初の提案は機能しませんでした。 –

+0

@net_prog:あなたのコードを修正する必要があります。これは1つの可能な提案である可能性があります。 – leppie

0

選択された回答は良いですが、単項式表現は含まれません。日時のプロパティを取得しようとすると、それは失敗します。

private static string GetPropertyName<TModel, TProperty>(Expression<Func<TModel, TProperty>> property) 
    { 
     if (property.Body is MemberExpression) 
     { 
      return ((MemberExpression)property.Body).Member.Name; 
     } 
     else 
     { 
      var op = ((UnaryExpression)property.Body).Operand; 
      return ((MemberExpression)op).Member.Name; 
     } 
    } 
1

C#6の新しいがNameOf演算子で、私は次のことを示唆している:

private string GetNameMyProperty1(TestC c = null) 
{ 
    return nameof(c.MyProperty1); 
} 
+0

オブジェクトのインスタンスは必要ありません。あなたは単に 'nameof(TestC.MyProperty1)'のようなことをすることができます – jausel

関連する問題