Convertir Func <Type, object> expression à Func <T> où T est la contrainte générique

c# expression-trees generics typeconverter

Question

J'ai cette fonction statique

public static object Create(Type t)
{
    //unimportant
}

Je n'ai pas de contrôle sur la fonction ci-dessus, je ne peux donc pas la modifier. Le problème est que ce n'est pas générique, je dois donc convertir l'objet renvoyé en un type. Ce type est fourni par la contrainte d'une autre classe générique d'où j'appelle la méthode Create .

C'est là que j'ai atteint:

public static object Create(Type t)
{
    //unimportant
}

Dans mon approche ci-dessus, je ne compile pas le dernier délégué, mais une étape auparavant. Comment puis-je intégrer le casting aussi avant la compilation et récupérer Func<T> ?

Réponse acceptée

Je pense que vous avez juste besoin d'un appel à Expression.Convert et d'utiliser un ConstantExpression au lieu d'un ParameterExpression :

var method = typeof(SomeClass).GetMethod("Create");
var call = Expression.Call(method, Expression.Constant(typeof(T), typeof(Type)));
var conversion = Expression.Convert(call, typeof(T));
var function = Expression.Lambda<Func<T>>(conversion).Compile();

(Je ne l'ai pas testé, mais ça a l'air correct ...)


Réponse populaire

Vous semblez être en train de sauter à travers beaucoup de cerceaux inutiles. Je ne comprends pas pourquoi vous faites cela à travers un arbre d'expression. Pourquoi pas simplement:

public static class Creator<T>
{
    public static void Create()
    {
        Func<T> mainThing = () => (T)SomeClass.Create(typeof(T));
    }
}

???

Quel est le but de la création d'un arbre d'expression d'un appel de méthode uniquement pour le reconvertir en délégué qui appelle un procédé que vous appelez? Pourquoi ne pas simplement appeler SomeClass.Create directement?

Y a-t-il quelque chose qui me manque ici?

Pour répondre à votre question actuelle:

Comment puis-je intégrer le casting aussi avant la compilation?

Utilisez Expression.Convert() pour créer un noeud d'arborescence d'expression qui représente une conversion.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi