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.
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
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% Die kurze Antwort ist, einen Delegaten MyActionDelegate
zu erstellen und dann zu verwenden:
Hier ist ein Arbeitsbeispiel mit einer generischen Klasse:
%Vor% Verwenden Sie es wie folgt, was 123
an die Konsole ausgibt:
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.
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.
Tags und Links .net c# reflection generics delegates