2012-01-24 10 views
7

があるとすれば、Tはどのオブジェクトでも、実行時のプロパティ名の1つの文字列を知っているので、どのようにして特定のプロパティを選択できますか?例えば実行時にIEnumerable <T>で動的選択を作成するにはどうすればよいですか?

var externalIEnumerable = DataPassedFromConsumingCode(); // `IEnumerable<T>` 

string knownPropertyName = "Foo"; 
var fooSelect = externalIEnumerable.Select(...); 

本質的には、私は明らかにちょうどexternalIEnumerable.Select(x=> x.Foo);をやっているが、私はそれが最初に作成されますときのコントロールを持っていないとき、私は、実行時にこのSelect実行する必要があります。

-

ANSWER: AlanTの答えに基づいて、ここで私が実際にやったことだ:

public Expression<Func<TItem, object>> SelectExpression<TItem>(string fieldName) 
{ 
    var param = Expression.Parameter(typeof(TItem), "item"); 
    var field = Expression.Property(param, fieldName); 
    return Expression.Lambda<Func<TItem, object>>(field, 
     new ParameterExpression[] { param }); 
} 

私はCompileを呼び出すことのIQueryableが列挙される原因となったため、式としてそれを守っていますデータベースが不必要にヒットしたことを意味します。だから、それを使用するために、私は次の操作を行います。

string primaryKey = _map.GetPrimaryKeys(typeof(TOriginator)).Single(); 
var primaryKeyExpression = SelectExpression<TOriginator>(primaryKey); 
var primaryKeyResults = query.Select(primaryKeyExpression).ToList(); 
+0

IEnumerableでTを制約できますか? – Jason

+1

これはlinq固有の質問ではありません。静的にコードではなく名前でプロパティに動的にアクセスする方法を尋ねていますか? –

+0

あなたのTは何でもかまいません。あなたのプロパティは何でもかまいません。あなたは単に文字列としてプロパティ名を持っていますか? –

答えて

6

例えばを使用して、これを行うことが可能です

private class Foo { 
    public string Bar { get; set; } 
} 

private IEnumerable<Foo> SomeFoos = new List<Foo>() { 
    new Foo{Bar = "Jan"}, 
    new Foo{Bar = "Feb"}, 
    new Foo{Bar = "Mar"}, 
    new Foo{Bar = "Apr"}, 
}; 

[TestMethod] 
public void GetDynamicProperty() { 

     var expr = SelectExpression<Foo, string>("Bar"); 
     var propValues = SomeFoos.Select(expr); 

     Assert.IsTrue(new[] { "Jan", "Feb", "Mar", "Apr" }.SequenceEqual(propValues)); 

    } 

public static Func<TItem, TField> SelectExpression<TItem, TField>(string fieldName) { 

    var param = Expression.Parameter(typeof(TItem), "item"); 
    var field = Expression.Property(param, fieldName); 
    return Expression.Lambda<Func<TItem, TField>>(field, new ParameterExpression[] { param }).Compile(); 

} 

HTH、
アラン。

0

大文字ご使用に合うことがあります。

関連する問題