2016-07-23 10 views
-1

ラムダ式のプロパティをリストする拡張メソッドを作成しようとしています。私はM => Mを入力するとthis.GetProperties<Example>(m=>m.ラムダ式のクラスプロパティを一覧表示します

は、拡張メソッドが

public static void GetProperties<T>(this T obj) where T : new() 
{ 

} 

以下予想される使用のようなものにすることができます例

public class Example { 
    Public string Name {get;set;} 
    Public string Description {get;set;} 
} 

という名前のクラスがあるとしましょう。両方のプロパティ(名前、説明)を表示する必要があります。

+1

? – user3185569

答えて

0

私はあなたのFuncを使用する必要があると思う:

public static void GetProperties<T, V>(this T obj, Func<T, V selector) where T : new() 
{ 

} 

使用法:

Example ex = new Example(); 

ex.GetProperties(m => m.Name); // Func<Example, string> 
ex.GetProperties(m => m.Description); // Func<Example, string> 

私は本当にメソッド内期待されるふるまいを理解していませんでした。しかし、あなたはm.Namem.Descriptionと言いました。したがって、プロパティセレクタはあなたの方法です。

Func<Example, string>Example入力パラメータを受け取り、(NameDescriptionの場合にプロパティである)stringを返す関数です。

0
public static class PropertyUtility 
{ 
    public static string GetPropertyName<T>(this T entity, Expression<Func<T, object>> exp) 
    { 
     if (exp.Body is MemberExpression) { 
     return ((MemberExpression)exp.Body).Member.Name; 
    } 
    else { 
     var op = ((UnaryExpression)exp.Body).Operand; 
     return ((MemberExpression)op).Member.Name; 
    } 
    } 
} 

そして、このように使用します。これは、エンティティフレームワークに関連してどのよう

Example ex = new Example(); 
var property = ex.GetPropertyName(x => x.Description); 
+0

セレクタがプロバイダによって使用されず、ローカルでのみ使用されるよう意図されている場合(なぜ 'Func'は完全に動作するでしょうか)、' Expression'を使う必要がありますか? – user3185569

+0

これは単なる例で、 'GetProperties'という名前のメソッドを持っていますが、おそらく値ではなくプロパティ名で処理したいと思っています。なぜセレクタとして渡すのですか? 「Get ...」というメソッドはsomethigを返します。 – Nina

関連する問題