ERROR Die statische Methode benötigt eine Null-Instanz, die nicht-statische Methode eine Nicht-Null-Instanz

c#-4.0 expression-trees lambda linq static-methods

Frage

Ich versuche, einen Ausdrucksbaum zu erstellen. Ich muss Daten von einer Datentabelle lesen und seine Spalten überprüfen. Die zu prüfenden Spalten und die Anzahl der zu prüfenden Spalten sind nur zur Laufzeit bekannt. Die Spaltennamen werden mir als String-Array gegeben und jede Spalte hat eine Liste von zu prüfenden Strings. Ich habe Probeexpressionsbäume ausprobiert, wie die untenstehende.

Hier stoße ich auf einen Fehler.

Die statische Methode benötigt eine Null-Instanz, die nicht-statische Methode eine Nicht-Null-Instanz. Parametername: Instanz

an der Linie

inner = Expression.Call (rowexp, mi, colexp);

Bitte hilf mir !!!

IQueryable<DataRow> queryableData = CapacityTable
    .AsEnumerable()
    .AsQueryable()
    .Where(row2 => values.Contains(row2.Field<string>("Head1").ToString()) 
                && values.Contains(row2.Field<string>("Head2").ToString()));

MethodInfo mi = typeof(DataRowExtensions).GetMethod(
     "Field", 
      new Type[] { typeof(DataRow),typeof(string) });

mi = mi.MakeGenericMethod(typeof(string));

ParameterExpression rowexp = Expression.Parameter(typeof(DataRow), "row");
ParameterExpression valuesexp = Expression.Parameter(typeof(List<string>), "values");
ParameterExpression fexp = Expression.Parameter(typeof(List<string>), "types");
Expression inner, outer, predicateBody = null;

foreach (var col in types)
{
    // DataRow row = CapacityTable.Rows[1];

    ParameterExpression colexp = Expression.Parameter(typeof(string), "col");
    //  Expression left = Expression.Call(pe, typeof(string).GetMethod("ToLower", System.Type.EmptyTypes));

    inner = Expression.Call(rowexp,mi, colexp);
    outer = Expression.Call(valuesexp, typeof(List<string>).GetMethod("Contains"), inner);
    predicateBody = Expression.And(predicateBody,outer);
}

MethodCallExpression whereCallExpression = Expression.Call(
    typeof(Queryable),
    "Where",
    new Type[] { queryableData.ElementType },
    queryableData.Expression,
    Expression.Lambda<Func<DataRow,bool>>(predicateBody, new ParameterExpression[] { rowexp }));

Akzeptierte Antwort

Das bedeutet, dass der Methodenaufruf, den Sie darzustellen versuchen, ein statischer ist, Sie geben ihm jedoch einen Zielausdruck. Das ist wie ein Anruf:

Thread t = new Thread(...);
// Invalid!
t.Sleep(1000);

Sie versuchen das in Form eines Ausdrucksbaums, was auch nicht erlaubt ist.

Es sieht so aus, als ob dies für die Field Extension-Methode auf DataRowExtensions - also muss das "Ziel" der Extension-Methode als das erste Argument des Aufrufs ausgedrückt werden, weil Sie tatsächlich aufrufen wollen:

DataRowExtensions.Field<T>(row, col);

Also du möchtest:

inner = Expression.Call(mi, rowexp, colexp);

Das wird diese Überladung aufrufen, die eine statische Methode mit zwei Argumenten aufruft.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum