Devo creare un metodo per selezionare una proprietà di avvio dalla raccolta con il tipo specificato.Impostare solo il tipo del secondo argomento nel metodo generico
io ho creato il metodo come questo (Ho rimosso alcune parti per la brevità):
public static IQueryable<TResult> SelectFirstPropertyWithType<T, TResult>(this IQueryable<T> source)
{
// Get the first property which has the TResult type
var propertyName = typeof(T).GetProperties()
.Where(x => x.PropertyType == typeof(TResult))
.Select(x => x.Name)
.FirstOrDefault();
var parameter = Expression.Parameter(typeof(T));
var body = Expression.Convert(Expression.PropertyOrField(parameter, propertyName), typeof(TResult));
var expression = Expression.Lambda<Func<T, TResult>>(body, parameter);
return source.Select(expression);
}
e posso chiamare questo metodo come:
List<Person> personList = new List<Person>();
// .. initialize personList
personList.AsQueryable()
.SelectFirstPropertyWithType<Person, int>()
.ToList();
tutto funziona bene.
Ma, non voglio impostare il tipo primo argomento come Person
, perché il compilatore può dedurre questo tipo di argomento dall'origine della raccolta. C'è un modo per chiamare il metodo del genere:
.SelectFirstPropertyWithType<int>()
Il problema è che ho bisogno T
parametro all'interno del mio metodo, e non voglio creare Func
con la riflessione in fase di esecuzione.
Grazie.
C'era molte domande simili su questo. La risposta è semplicemente - non puoi fare qualcosa del genere. Compilatore che potrebbe dedurre tutti i tipi o nessuno –