expression tree Problem

  • VB.NET
  • .NET (FX) 4.0

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von vb_fan.

    expression tree Problem

    Hallo,

    ich möchte dieses Query hier mit expression trees abbilden:

    VB.NET-Quellcode

    1. Dim test = result.GroupBy(Function(row) groupedindexes.Select(
    2. Function(grpindex) row(grpindex)).ToArray, comp).
    3. Select(Function(g) New groupedresult(g.Key, g.Sum(Function(x) Convert.ToInt32(x(3)))))


    Den Teil habe ich schon:

    VB.NET-Quellcode

    1. Function(row) groupedindexes.Select(
    2. Function(grpindex) row(grpindex))


    Nun möchte ich weitermachen, aber bekomme Fehler bei dem ToArray Aufruf:

    VB.NET-Quellcode

    1. Method 'System.Object[] ToArray()' declared on type 'System.Collections.ArrayList' cannot be called with instance of type 'System.Func`2[System.Object[],System.Collections.Generic.IEnumerable`1[System.Object]]'


    Der Fehler ist für mich klar, ich müsste im Code das hier ändern:

    VB.NET-Quellcode

    1. Dim toarrayMethod = GetType(System.Collections.ArrayList).GetMethod("ToArray", New Type(-1) {})


    Ich habe schon mal einiges rumprobiert, aber bei den Versuchen war

    VB.NET-Quellcode

    1. toarrayMethod
    immer null.

    Ich habe z. B. das hier versucht:

    VB.NET-Quellcode

    1. Dim toarrayMethod = GetType(Enumerable).GetMethod("ToArray", New Type(-1) {})


    Und ich habe noch IEnumerable mit dem Typ in der Fehlermeldung versucht, leider ohne Erfolg.

    Kann mich jemand beraten?

    Anbei das Sampleprojekt.

    Danke.
    Dateien
    • exp_tree.zip

      (84,79 kB, 65 mal heruntergeladen, zuletzt: )
    Bevor der Frage habe ich schon im Ojektbrowser nach ToArray gesucht, habe IEnumerable auch gefunden, habe die Zeile korrigiert, aber da bekam ich nur nothing zurück.

    Also das Select gibt

    VB.NET-Quellcode

    1. System.Collections.Generic.IEnumerable(Of Object)
    zurück, deshalb habe ich das jetzt so geändert:

    VB.NET-Quellcode

    1. Dim toarrayMethod = GetType(System.Collections.Generic.IEnumerable(Of Object)).GetMethod("ToArray", New Type() {GetType(System.Collections.Generic.IEnumerable(Of Object))})


    Aber bekomme noch immer Nothing zurück.

    Deshalb habe ich das hier gemacht:

    VB.NET-Quellcode

    1. Dim toarrayMethod2 = GetType(Enumerable).GetMethods(BindingFlags.Public Or BindingFlags.Static).First(Function(m) m.Name = "ToArray").MakeGenericMethod(GetType(Object))


    Da habe ich schon den Method. Mal schauen, ob das funktioniert.

    EDIT:
    jetzt habe ich Probleme hier:

    VB.NET-Quellcode

    1. expr = Expression.Call(groupbyMethod, Expression.Call(outerfieldselector, toarrayMethod2), cmp)


    vb sagt: Static method requires null instance, non-static method requires non-null instance.

    Den Fehler kenne ich schon von früher, aber m. E. ist die obige Codezeile richtig: ich möchte an outerfieldselector ToArray aufrufen. Was ist aber das Problem?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „vb_fan“ ()