Frage

Ich bin versucht, einen Ausdruck Baum zu erzeugen, die letztlich eine Reihe von GroupBy Methoden auf dem Enumerable Typ nennt.

In vereinfachter Form ich so etwas wie dies bin versucht:

IEnumerable<Data> list = new List<Data>{new Data{Name = "A", Age=10},
   new Data{Name = "A", Age=12},
   new Data{Name = "B", Age=20},
   new Data{Name="C", Age=15}};

Expression data = Expression.Parameter(typeof(IEnumerable<Data>), "data");
Expression arg = Expression.Parameter(typeof(Data), "arg");
Expression nameProperty = Expression.PropertyOrField(arg, "Name");

Expression group = Expression.Call(typeof(Enumerable), "GroupBy", new Type[] { typeof(Data), typeof(string) }, data, nameProperty);

Der Aufruf am Ende Expression.Call wirft „Keine Methode‚GroupBy‘auf Typen‚System.Linq.Enumerable‘ist kompatibel mit den mitgelieferten Argumenten.“

Ich mache eine ähnliche Sache, in ähnlicher Weise mit Enumerable.OrderBy erfolgreich und bin ratlos.

Jede Hilfe ist willkommen.

War es hilfreich?

Lösung

Sie brauchen nicht einen Lambda-in als zweiter Typ passieren? wie so.

    public void Test()
    {
        IEnumerable<Data> list = new List<Data>
        {
            new Data{Name = "A", Age=10},
            new Data{Name = "A", Age=12},
            new Data{Name = "B", Age=20},
            new Data{Name= "C", Age=15}
        };


        var data = Expression.Parameter(typeof(IEnumerable<Data>), "data");
        var arg = Expression.Parameter(typeof(Data), "arg");
        var nameProperty = Expression.PropertyOrField(arg, "Name");
        var lambda = Expression.Lambda<Func<Data, string>>(nameProperty, arg);

        var expression = Expression.Call(
            typeof(Enumerable),
            "GroupBy", 
            new Type[] { typeof(Data), typeof(string) },
            data,
            lambda);

        //expected = {data.GroupBy(arg => arg.Name)}
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top