Déclarer Func <in T, out Result> dynamiquement

anonymous-methods c# expression-trees lambda predicate

Question

Considère ceci:

var propertyinfo = typeof(Customer).GetProperty(sortExpressionStr);
Type orderType = propertyinfo.PropertyType;

maintenant je veux déclarer

var propertyinfo = typeof(Customer).GetProperty(sortExpressionStr);
Type orderType = propertyinfo.PropertyType;

Je sais que ce n'est pas possible directement, car ordertype est à l'exécution, mais existe-t-il une solution de contournement?

c'est exactement ce que je veux faire:

var propertyinfo = typeof(Customer).GetProperty(sortExpressionStr);
Type orderType = propertyinfo.PropertyType;

tout cela parce que je veux convertir:

var propertyinfo = typeof(Customer).GetProperty(sortExpressionStr);
Type orderType = propertyinfo.PropertyType;

ou si ce n'est pas possible alors je veux le créer à partir du premier endroit avec le bon type, le cas est le suivant:

Je suis dans une méthode qui a un type(Customer) et un nom de propriété de ce type que je souhaite commander, je veux créer un arbre d'expression de tri pour le transmettre à Orderby (ici).

Réponse acceptée

linqClass.OrderBy(GetSortExpression(sortstr));


public static Expression<Func<T,object>> GetSortExpression<T>(string sortExpressionStr)
    {
        var param = Expression.Parameter(typeof(T), "x");
        var sortExpression = Expression.Lambda<Func<T, object>>(Expression.Property(param, sortExpressionStr), param);
        return sortExpression;
    }

cela a fonctionné, mon problème était que je passais le paramètre supplémentaire Typeof (Object) et orderby m'avait dit qu'il ne pouvait pas trier par type d'objet. Merci a tous

merci dtb je vérifierai si votre réponse fonctionne aussi et je l'accepterai si cela fonctionne sinon je l'accepterai.


Réponse populaire

Vous pouvez le faire en utilisant une définition de type générique ouverte, puis en créant le type spécifique à partir de celui-ci:

typeof(Func<,>).MakeGenericType(typeof(int), orderType);

Cependant, ce que vous essayez de faire (appeler Lambda<TDelegate> ) n’est pas directement possible. Vous devez appeler Lambda sans paramètre de type:

typeof(Func<,>).MakeGenericType(typeof(int), orderType);

Cela créera le bon Func<,> pour vous dans les coulisses. Si vous voulez compiler l'expression et utiliser le délégué, vous ne pouvez le faire que de manière dynamique avec

typeof(Func<,>).MakeGenericType(typeof(int), orderType);

Si vous souhaitez appeler la méthode d'extension OrderBy sur Queryable , les choses se compliquent un peu:

typeof(Func<,>).MakeGenericType(typeof(int), orderType);



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