2016-10-31 4 views
0

Je tente de générer une expression dynamique à partir d'une chaîne de noms de propriété (donnée par l'utilisateur) sur un IQueryable nommé source. C'est ce que j'ai jusqu'à présent:Appel de ToString() sur une expression de génération dynamique

var parameter = Expression.Parameter(source.ElementType, "x"); 
var member = propertyChain.Split('.').Aggregate((Expression)parameter, Expression.PropertyOrField); 
var selector = Expression.Lambda(member, parameter); 

qui me donne quelque chose comme x => x.MainProperty.SubProperty lorsque l'entrée serait MainProperty.SubProperty.

Je dois maintenant ajouter ToString() à l'expression selector afin qu'il produise l'expression x => x.MainProperty.SubProperty.ToString() qui peut ensuite être passé dans d'autres méthodes.

Comment cela peut-il être fait?

Modifier 1

Je suis en train de construire une dynamique GroupBy où le type de la clé n'a pas d'importance. Mais la propriété de groupe peut être de type Guid, int ou autre chose. C'est pourquoi je dois appeler ToString().

public static IEnumerable<IGrouping<string, T>>(IQueryable<T> source, string propertyChain) 
{ 
    var parameter = Expression.Parameter(source.ElementType, "x"); 
    var member = propertyChain.Split('.').Aggregate((Expression)parameter, Expression.PropertyOrField); 
    var selector = Expression.Lambda(member, parameter); 

    // currently here I have x => x.MainProperty.SubProperty 
    // here I would Invoke the GroupBy of IQueryable with T and string via reflection 
} 
+0

Pouvez-vous donner un exemple de travail? –

+0

@JeroenvanLangen J'ai ajouté un exemple de ce que je vais accomplir au moins avec ce – KingKerosin

Répondre

3

Vous pouvez utiliser la Expression.Call surcharge par exemple suivant:

var toString = Expression.Call(member, "ToString", Type.EmptyTypes); 
var selector = Expression.Lambda<Func<T, string>>(toString, parameter); 
return source.GroupBy(selector); 
+0

Exactement ce dont j'avais besoin. Maintenant, je peux regrouper tout ce que j'aime;). Merci – KingKerosin

+0

Comment puis-je convertir une liste de chaînes ('{" PropertyOne "," PropertyTwo "}') pour avoir le 'selector' être' s => s.PropertyOne + "|" + s.PropertyTwo' où la liste peut contenir un nombre inconnu de chaînes? – KingKerosin

+0

Vous pouvez utiliser 'Expression.Call' pour l'une des surcharges' string.Concat' (par exemple ['String.Concat Méthode (String, String, String)'] (https://msdn.microsoft.com/fr us/library/5e285t1h (v = vs.110) .aspx)) –