Dado que tengo un IEnumerable<T>
, donde T
es cualquier objeto, ¿cómo puedo seleccionar una propiedad específica de él, dado que sé el nombre de uno de los nombres de propiedad en tiempo de ejecución como una cadena?¿Cómo puedo crear una selección dinámica en un IEnumerable <T> en tiempo de ejecución?
Por ejemplo:
var externalIEnumerable = DataPassedFromConsumingCode(); // `IEnumerable<T>`
string knownPropertyName = "Foo";
var fooSelect = externalIEnumerable.Select(...);
En esencia, obviamente estoy simplemente haciendo externalIEnumerable.Select(x=> x.Foo);
, pero necesito para realizar este Select
en tiempo de ejecución, cuando no tengo control sobre cuando se crea inicialmente.
-
RESPUESTA: Sobre la base de la respuesta de Alant, esto es lo que realmente hice:
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 });
}
que lo mantuvieron como una expresión, porque llamando Compile
causó la IQueryable de estar numerado, que significaba que la base de datos fue golpeada innecesariamente. Por lo tanto, para usarlo, simplemente hacer lo siguiente:
string primaryKey = _map.GetPrimaryKeys(typeof(TOriginator)).Single();
var primaryKeyExpression = SelectExpression<TOriginator>(primaryKey);
var primaryKeyResults = query.Select(primaryKeyExpression).ToList();
¿se puede restringir T en IEnumerable? – Jason
Esta no es una pregunta específica de linq, ¿verdad? ¿Está preguntando cómo acceder a una propiedad dinámicamente por nombre en lugar de estáticamente en el código? –
Para aclarar, su T podría ser cualquier cosa, su propiedad podría ser cualquier cosa, ¿simplemente tendrá el nombre de la propiedad como una cadena? –