Wie kann ich ActionT zur Laufzeit dynamisch erstellen?

8

Ich möchte zur Laufzeit Folgendes ausführen können:

%Vor%

Ich weiß, dass ich den richtigen Typ für die Aktion ermitteln muss, aber nicht sicher bin, wie das letzte Bit mithilfe von Delegate.Create abgerufen werden kann. Type repräsentiert T in der Aktionsdefinition.

%Vor%

Der Punkt, an dem Leute zu fehlen scheinen, ist, dass ich versuche, eine Instanz von Action zu erstellen, in der T nicht statisch spezifiziert werden kann, weil sie von einer von Attribute abgeleiteten Klasse verwendet wird - das bedeutet, dass T alles sein kann und nicht kann sei definiert als generische Definition

Prost

    
AwkwardCoder 26.08.2012, 15:22
quelle

4 Antworten

1

Wenn Sie wissen, welche Operation Sie ausführen müssen und wie Sie diese unabhängig vom Typ ausführen sollen (wie in Ihrem Beispiel), sollten Sie einfach eine generische Methode erstellen, die die Operation ausführt und Ihren Delegaten auf diese Weise erstellt?

%Vor%     
mlorbetske 22.09.2012 06:29
quelle
0

Sie können folgenden Code verwenden, wenn der Typ in ein Objekt gegossen werden kann:

%Vor%

Wenn der Typ jedoch enum oder ein anderer Werttyp ist, wird es nicht funktionieren.

    
pakeha_by 19.09.2012 23:05
quelle
-1

Die kurze Antwort ist, einen Delegaten MyActionDelegate zu erstellen und dann zu verwenden:

%Vor%

Hier ist ein Arbeitsbeispiel mit einer generischen Klasse:

%Vor%

Verwenden Sie es wie folgt, was 123 an die Konsole ausgibt:

%Vor%

Sie werden feststellen, dass ich zwei Parameter an Constructor.Invoke ; Das liegt daran, dass ein Delegate-Argument tatsächlich als zwei Argumente kompiliert wird: das Zielobjekt der Funktion und ein Zeiger auf die Funktion. Ich kann nicht für die phantastische Beinarbeit dort Kredit nehmen; "geliehene" Informationen von dieser ausgezeichneten Antwort darauf, wie man ein Delegatargument durch Reflexion weitergibt.

    
McGarnagle 26.08.2012 16:37
quelle
-1

Verwenden Sie den folgenden Code, um einen Delegaten zu erstellen, der spät im Typparameter gebunden ist. Siehe auch Vorgehensweise: Generische Typen mit Reflection untersuchen und instantiieren .

%Vor%

Das heißt, ich empfehle nicht, diese Methode zu verwenden. Verwenden Sie stattdessen

%Vor%

Es bietet

  • Die gleiche Funktionalität.

    Ihr ursprünglicher Code "Called = " + obj" ruft .ToString() für den Parameter auf. So macht das obige.

  • Kein Leistungsunterschied.

    Wenn der Parameter obj ein Werttyp ist, führen beide Varianten einen Boxing-Vorgang durch. Das Boxen in der ersten ist nicht offensichtlich, aber "Called = " + obj" Boxen Werttypen.

  • Kürzer und weniger fehleranfällig.

Mark 09.09.2012 12:34
quelle