Je suis en train d'essayer de faire this, mais je ne sais pas ce que sera T, donc je construis des choses en utilisant des arbres de réflexion et d'expression.Convertir func pour prédire en utilisant la réflexion 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 });
Fondamentalement, j'ai un List<Book>
, que je suis en train de réfléchir et Invoke
sa méthode Find
. La méthode Find
a besoin d'un Predicate<Book>
au lieu de Func<Book, bool>
, et je me suis battu la tête contre cela pendant quelques heures.
Edit: Voici la première partie de la trace d'erreur:
System.MissingMethodException: Constructor on type 'System.Predicate`1[[MyProject.Book, MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' not found.
Si quelqu'un a besoin de voir la partie où j'invoquons la méthode Find, je peux également fournir, mais je pensais que ce serait porter atteinte à l'essentiel partie de la question. –