があるとすれば、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();
IEnumerableでTを制約できますか? – Jason
これはlinq固有の質問ではありません。静的にコードではなく名前でプロパティに動的にアクセスする方法を尋ねていますか? –
あなたのTは何でもかまいません。あなたのプロパティは何でもかまいません。あなたは単に文字列としてプロパティ名を持っていますか? –