オブジェクトがあるIEnumerable<T>
場合T
、実行時にプロパティ名の1つの名前を文字列として知っている場合、そのオブジェクトから特定のプロパティを選択するにはどうすればよいですか?
例えば:
var externalIEnumerable = DataPassedFromConsumingCode(); // `IEnumerable<T>`
string knownPropertyName = "Foo";
var fooSelect = externalIEnumerable.Select(...);
本質的に、私は明らかに実行しているだけですが、最初に作成されるタイミングを制御できない場合は、実行時にexternalIEnumerable.Select(x=> x.Foo);
これを実行する必要があります。Select
-
回答: 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();