2011-09-23 7 views
9

強く型付けされておらず、リフレクションに依存している作業用セットアップがあります。私はクラスを持っているlambda式としてのプロパティ

は、

class Person{ 

    public string FirstName {get ; set;} 
    public string LastName {get; set;} 
    public int Age {get; set;} 
    ... 
    // some more public properties 
} 

class CellInfo { 
    public string Title {get; set;} 
    public string FormatString {get; set;} 
} 

を言うと、私はそれは、プロパティの名前と簡単な辞書といくつかの情報についてです。この

Dictionary<string, CellInfo> fields = new Dictionary<string, CellInfo>(); 
fields.Add("FirstName", new CellInfo {Title = "First Name", FormatString = "Foo"}); 
fields.Add("LastName", new CellInfo {Title = "Last Name", FormatString = "Bar"}); 

などの辞書を持っていますそれら。 は、私は人のインスタンスを処理して別のモジュールに辞書を渡すと、私は

Dictionary<string, CellInfo> fields = SomeMethodToGetDictionary(); 
foreach(Person p in someCollection) 
{ 
    foreach(var field in fields) 
    { 
     object cellValue = type(Person).GetProperty(field.Key).GetValue(p, null); 
     // use cellValue and info on field from field.Value somewhere. 
     ... 
    } 
} 
フィールド名の文字列を渡すと、リフレクションを使用するこの方法は、作品

を行いますが、やって強く型付けされた方法がある場合、私は思っていましたこの。

私が念頭に置いていたことは、人を対象にEvalExpressionを使用してプロパティ値を取得何とか、この

fields.Add("FirstName", new CellInfo 
        { 
         Title = "First Name", 
         FormatString = "Foo", 
         EvalExpression = p => p.FirstName 
        }); 

と使用時のようなものをLINQ式を保存性質を持っていました。私はどこから始めるべきか、このような財産を評価することができるように構文がどんなものになるかという手掛かりはありません。私は、デリゲートと式ツリーを機能させるのが初めてで、検索する正しいキーワードがわからない。私の記述がはっきりしていることを望む。そうでない場合は、私に知らせてください。 援助をいただければ幸いです。

答えて

1

あなたは、これはあなたが強くを入力言って何を意味するかである場合、文字列としてプロパティ名をコーディングする必要がないように、このような何かを試すことができます。

class CellInfo<T> 
{ 
    public string Title { get; set; } 
    public string FormatString { get; set; } 
    public Func<T, object> Selector { get; set; } 
} 

Dictionary<string, CellInfo<Person>> dict = new Dictionary<string, CellInfo<Person>>(); 

dict.Add("LastName", new CellInfo<Person> { Selector = p => p.LastName }); 
dict.Add("Age", new CellInfo<Person> { Selector = p => p.Age }); 

foreach (Person p in someCollection) 
{ 
    foreach (var cellInfo in dict) 
    { 
     object value = cellInfo.Value.Selector(p); 
    } 
} 
-1

(あなたの質問が明確ではなく、長いです。初期のものをトリム。)

これは、ASP.NET MVCは、HTMLの入力にフィールド名を作成するための反射やラムダ式を使用する方法である、などあなたが持っていることができるようにその問題のソースコードを見てください。

簡単に言えば、式をメンバー式にキャストして名前を取得する必要があります。簡単:

MemberExpression memberExpression = EvalExpression.Body as MemberExpression; 
if (memberExpression == null) 
    throw new InvalidOperationException("Not a memberExpression"); 

if (!(memberExpression.Member is PropertyInfo)) 
    throw new InvalidOperationException("Not a property"); 

return memberExpression.Member.Name; // returns FirstName 
+0

誰もがCに気遣いますなぜdownvote? – Aliostad

+0

これは、最初の行で(要求とは対照的に)コマンドである可能性があります。 – MikeKulls

0

私はデリゲートが必要なものだと思います。このような何か:

public delegate string EvalExpressionDelegate (Person); 

class CellInfo 
{ 
    public string Title {get; set;} 
    public string FormatString {get; set;} 
    public EvalExpressionDelegate EvalExpression = null; 
} 

fields.Add("FirstName", new CellInfo 
        { 
         Title = "First Name", 
         FormatString = "Foo", 
         EvalExpression = p => p.FirstName 
        }); 
+0

+1良い情報私は 'Func 'は、あなたが持っている代議員の略語であり、誰かがそれを気付かずにあなたにdownvoteを与えたと思います。 –

+0

@ProfessorChaos私は、デリゲートを書くことは、パラメータの命名などの利点を持つことができますが、それを行う古風な方法と考えられているためです。 – MikeKulls

2

デリゲートを使用します:

class CellInfo { 
    public string Title {get; set; } 
    public string FormatString {get; set; } 
    public Func<Person, object> EvalExpression { get; set; } 
} 

その後、あなたのラムダ入力がうまくいく...

関連する問題