鉴于我有一个IEnumerable<T>
,T
任何对象在哪里,我如何从中选择一个特定的属性,因为我在运行时知道其中一个属性名称的名称作为字符串?
例如:
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();