Básicamente estoy tratando de hacer this, pero no sé qué será T, entonces estoy construyendo cosas usando árboles de Reflexión y Expresión.Convertir func en predicado usando la reflexión en C#
// Input (I don't know about "Book")
Type itemType = typeof(Book);
// Actual Code
// Build up func p => p.AuthorName == "Jon Skeet"
ParameterExpression predParam = Expression.Parameter(itemType, "p");
Expression left = Expression.Field(predParam, itemType.GetField("AuthorName"));
Expression right = Expression.Constant("Jon Skeet", typeof(string));
Expression equality = Expression.Equal(left, right);
Delegate myDelegate = Expression.Lambda(equality, new ParameterExpression[] { predParam }).Compile(); // Not sure if I need this
// Build up predicate type (Predicate<Book>)
Type genericPredicateType = typeof(Predicate<>);
Type constructedPredicateType = genericPredicateType.MakeGenericType(new Type[] { itemType });
// I need an instance to use this predicate, right? (** This Fails **)
object predicateInstance = Activator.CreateInstance(constructedPredicateType, new object[] { myDelegate });
Básicamente, tengo un List<Book>
, lo que estoy tratando de reflexionar y Invoke
su método Find
. El método Find
necesita un Predicate<Book>
en lugar de Func<Book, bool>
, y he estado golpeando mi cabeza contra esto durante unas horas.
Editar: Esta es la primera parte de la traza de error:
System.MissingMethodException: Constructor on type 'System.Predicate`1[[MyProject.Book, MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' not found.
Si alguien necesita ver la parte en la que invocar el método Find, puedo también la oferta, pero pensé que iría en detrimento de lo esencial parte de la pregunta. –