Wie gebe ich das Objekt an, das von einer Ausdrucksbaumethode zurückgegeben werden soll?

.net expression-trees

Frage

Ich versuche, eine Methode zu erstellen, die einen Ausdrucksbaum verwendet, der ein Objekt zurückgibt, aber ich kann nicht herausfinden, wie das zurückzugebende Objekt tatsächlich angegeben wird. Ich habe versucht, dies zu lesen, aber der Rückgabewert scheint eigentlich nirgends angegeben zu sein.

Ich habe alle Zuordnungen und Dinge, aber wie gebe ich das Objekt an, das von einer Methode zurückgegeben werden soll, die mit Ausdrucksbäumen erstellt wurde?

BEARBEITEN: das sind v4-Ausdrucksbäume, und die Methode, die ich versuche zu erstellen, tut etwas in der Art:

private object ReadStruct(BinaryReader reader) {
    StructType obj = new StructType();
    obj.Field1 = reader.ReadSomething();
    obj.Field2 = reader.ReadSomething();
    //...more...
    return obj;
}

Akzeptierte Antwort

Anscheinend ist eine return ein GotoExpression , den Sie mit der Factory-Methode Expression.Return erstellen können. Sie müssen am Ende ein Label erstellen, um zu diesem zu springen. Etwas wie das:

// an expression representing the obj variable
ParameterExpression objExpression = ...;

LabelTarget returnTarget = Expression.Label(typeof(StructType));

GotoExpression returnExpression = Expression.Return(returnTarget, 
    objExpression, typeof(StructType));

LabelExpression returnLabel = Expression.Label(returnTarget, defaultValue);

BlockExpression block = Expression.Block(
    /* ... variables, all the other lines and... */,
    returnExpression,
    returnLabel);

Die Typen des Label-Ziels und des Goto-Ausdrucks müssen übereinstimmen. Da das Label-Ziel einen Typ hat, muss der Label-Ausdruck einen Standardwert haben.


Beliebte Antwort

In Fällen, die einen vorhandenen Parameter oder eine vorhandene Variable zurückgeben, gibt es einen viel einfacheren Weg. Die letzte Anweisung in einem Block-Ausdruck wird zum Rückgabewert. Sie können den ParameterExpression am Ende erneut einfügen, um ihn zurückzugeben.

Angenommen, Ihre Struktur ist wie folgt:

public struct StructType
{
    public byte Field1;
    public short Field2;
}

Dann würde Ihr Code wie folgt aussehen:

public struct StructType
{
    public byte Field1;
    public short Field2;
}

Testen Sie, dass es funktioniert:

public struct StructType
{
    public byte Field1;
    public short Field2;
}

Es ist erwähnenswert, dass dieses Beispiel funktioniert, wenn StructType eine Struktur ist. Wenn es sich um eine Klasse handelt, rufen Sie einfach den Konstruktor auf und initialisieren structVar zuerst in der BlockExpression.




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