War diese Seite hilfreich?
Ihr Feedback ist uns wichtig. Teilen Sie uns Ihre Meinung mit.
Weiteres Feedback?
1500 verbleibende Zeichen
Exportieren (0) Drucken
Alle erweitern
Dieser Artikel wurde maschinell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen. Weitere Informationen
Übersetzung
Original

Delegate::CreateDelegate-Methode (Type, Object, MethodInfo, Boolean)

Erstellt einen Delegaten vom angegebenen Typ, der die angegebene statische Methode oder Instanzmethode mit dem angegebenen ersten Argument und dem angegebenen Verhalten bei Bindungsfehlern darstellt.

Namespace:  System
Assembly:  mscorlib (in mscorlib.dll)

public:
static Delegate^ CreateDelegate(
	Type^ type, 
	Object^ firstArgument, 
	MethodInfo^ method, 
	bool throwOnBindFailure
)

Parameter

type
Typ: System::Type
Ein Type, der den Typ des zu erstellenden Delegaten darstellt.
firstArgument
Typ: System::Object
Ein Object, das das erste Argument der Methode ist, die der Delegat darstellt. Bei Instanzmethoden muss dieses mit dem Instanztyp kompatibel sein.
method
Typ: System.Reflection::MethodInfo
Die MethodInfo, die die statische oder Instanzmethode beschreibt, die der Delegat darstellen soll.
throwOnBindFailure
Typ: System::Boolean
true , um eine Ausnahme auszulösen, wenn method nicht gebunden werden kann, andernfalls false.

Rückgabewert

Typ: System::Delegate
Ein Delegat des angegebenen Typs, der die bestimmte statische oder Instanzmethode darstellt, oder ein Nullverweis (Nothing in Visual Basic), wenn throwOnBindFailurefalse ist und der Delegat nicht an method gebunden werden kann.

AusnahmeBedingung
ArgumentNullException

type ist ein Nullverweis (Nothing in Visual Basic).

- oder -

method ist ein Nullverweis (Nothing in Visual Basic).

ArgumentException

type erbt nicht MulticastDelegate.

- oder -

type ist kein RuntimeType. Siehe Laufzeittypen in Reflexion.

- oder -

method kann nicht gebunden werden, und throwOnBindFailure ist true.

- oder -

method ist keine RuntimeMethodInfo. Siehe Laufzeittypen in Reflexion.

MissingMethodException

Die Invoke-Methode von type wurde nicht gefunden.

MethodAccessException

Der Aufrufer verfügt nicht über die für den Zugriff auf method erforderlichen Zugriffsberechtigungen.

Diese und die CreateDelegate(Type, Object, MethodInfo)-Methodenüberladung, die immer einen Bindungsfehler auslöst, bieten die flexibelste Art zum Erstellen von Delegaten. Sie können diese verwenden, um Delegaten für statische Methoden oder Instanzmethoden mit oder ohne ein erstes Argument zu erstellen.

HinweisHinweis

Wenn Sie kein erstes Argument angeben, verwenden Sie aus Gründen der besseren Leistung die CreateDelegate(Type, MethodInfo, Boolean)-Methodenüberladung.

Der Delegattyp und die Methode müssen über kompatible Rückgabetypen verfügen. Das heißt, der Rückgabetyp von method muss dem Rückgabetyp type zugewiesen werden können.

Wenn firstArgument angegeben wird, wird es bei jedem Aufruf des Delegaten an method übergeben. firstArgument wird als an den Delegaten gebunden bezeichnet, und der Delegat wird als über dem ersten Argument geschlossen bezeichnet. Wenn methodstatic (Shared in Visual Basic) ist, enthält die beim Aufrufen des Delegaten angegebene Argumentliste alle Parameter mit Ausnahme des ersten. Wenn method eine Instanzmethode ist, wird firstArgument an den (durch this in C# oder Me in Visual Basic dargestellten) verborgenen Instanzparameter übergeben.

Wenn firstArgument angegeben wird, muss der erste Parameter von method ein Referenztyp sein, und firstArgument muss zu diesem Typ kompatibel sein.

Wichtiger HinweisWichtig

Wenn methodstatic (Shared in Visual Basic) ist und ihr erster Parameter vom Typ Object oder ValueType ist, kann firstArgument ein Werttyp sein. In diesem Fall wird firstArgument automatisch eingeschlossen. Automatisches Boxing wird für keines der anderen Argumente ausgeführt, wie es in einem C#- Visual Basic-Funktionsaufruf der Fall ist.

Wenn firstArgument ein NULL-Verweis ist und method eine Instanzmethode ist, hängt das Ergebnis von den Signaturen des Delegattypen type und der method ab:

  • Wenn die Signatur von type explizit den ersten verborgenen Parameter von method enthält, wird vom Delegaten gesagt, dass er eine offene Instanzmethode darstellt. Wenn der Delegat aufgerufen wird, wird das erste Argument in der Argumentliste an den verborgenen Instanzparameter von method übergeben.

  • Wenn die Signaturen von method und type übereinstimmen (d. h., alle Parametertypen sind kompatibel), wird vom Delegaten gesagt, dass er über einem NULL-Verweis geschlossen ist. Das Aufrufen des Delegaten entspricht dem Aufrufen einer Instanzmethode für eine NULL-Instanz, was jedoch wenig sinnvoll ist.

Wenn firstArgument ein NULL-Verweis ist und method statisch ist, hängt das Ergebnis von den Signaturen des Delegattypen type und der method ab:

  • Wenn die Signatur von method und type übereinstimmt (d. h., alle Parametertypen sind kompatibel), wird vom Delegaten gesagt, dass er eine offene statische Methode darstellt. Dies ist der häufigste Fall für statische Methoden. In diesem Fall können Sie eine etwas bessere Leistung erzielen, indem Sie die CreateDelegate(Type, MethodInfo, Boolean)-Methodenüberladung verwenden.

  • Wenn die Signatur von type mit dem zweiten Parameter von method beginnt und die verbleibenden Parametertypen kompatibel sind, dann wird vom Delegaten gesagt, dass er über einem NULL-Verweis geschlossen ist. Wenn der Delegat aufgerufen wird, wird ein NULL-Verweis an den ersten Parameter von methodübergeben.

HinweisHinweis

Ab .NET Framework 2.0 Service Pack 1 kann diese Methode verwendet werden, um auf nicht öffentliche Methoden zuzugreifen, wenn dem Aufrufer ReflectionPermission mit dem ReflectionPermissionFlag::RestrictedMemberAccess-Flag gewährt wurden und der Berechtigungssatz der nicht öffentlichen Methoden auf den Berechtigungssatz des Aufrufers oder auf eine Teilmenge dieses Berechtigungssatzes beschränkt ist. (Siehe Sicherheitsüberlegungen für die Reflektion.)

Zur Verwendung dieser Funktionen sollte die Anwendung für .NET Framework 3.5 oder höher ausgelegt sein.

Kompatible Parametertypen und kompatibler Rückgabetyp

Die Parametertypen und der Rückgabetyp eines Delegaten muss mit den Parametertypen und dem Rückgabetyp der Methode kompatibel sein, die der Delegat darstellt. Die Typen müssen nicht genau übereinstimmen.

HinweisHinweis

In .NET Framework, Version 1.0 und 1.1, müssen die Typen genau übereinstimmen.

Ein Parameter eines Delegaten ist mit dem entsprechenden Parameter einer Methode kompatibel, wenn der Typ des Delegatenparameters restriktiver ist als der Methodenparameter, da so gewährleistet ist, dass ein an den Delegaten übergebenes Argument problemlos an die Methode weitergeleitet werden kann.

Ebenso ist der Rückgabetyp eines Delegaten kompatibel mit dem Rückgabetyp einer Methode, wenn der Rückgabetyp der Methode restriktiver ist als der Rückgabetyp des Delegaten, da so gewährleistet ist, dass der Rückgabewert der Methode problemlos in den Rückgabetyp des Delegaten umgewandelt werden kann.

Beispielsweise kann ein Delegat mit dem Parametertyp Hashtable und dem Rückgabetyp Object eine Methode mit dem Parametertyp Object und dem Rückgabetyp Hashtable darstellen.

Bestimmen der Methoden, die ein Delegat darstellen kann

Die von dieser Überladung von CreateDelegate ermöglichte Flexibilität lässt sich auch so verstehen, dass jeder angegebene Delegat vier verschiedene Kombinationen aus Methodensignatur und Methodenart (statisch oder Instanz) darstellen kann. Betrachten Sie einen Delegattyp D mit einem Argument des Typs C. Im Folgenden werden die Methoden beschrieben, die D darstellen kann, wobei der Rückgabetyp ignoriert wird, da er in allen Fällen übereinstimmen muss:

  • D kann eine beliebige Instanzmethode mit genau einem Argument vom Typ C darstellen, unabhängig vom Typ, dem die Instanzmethode angehört. Wenn CreateDelegate aufgerufen wird, ist firstArgument eine Instanz des Typs, dem method angehört, und vom resultierenden Delegaten wird gesagt, dass er über dieser Instanz geschlossen ist. (Im Grunde kann D auch über einem NULL-Verweis geschlossen werden, wenn firstArgumentein Nullverweis (Nothing in Visual Basic) ist.)

  • D kann eine Instanzmethode von C darstellen, die über keine Argumente verfügt. Wenn CreateDelegate aufgerufen wird, ist firstArgument ein NULL-Verweis. Der resultierende Delegat stellt eine offene Instanzmethode dar, und eine Instanz von C muss bei jedem Aufruf angegeben werden.

  • D kann eine statische Methode darstellen, die ein Argument vom Typ C akzeptiert, und die Methode kann zu einem beliebigen Typ gehören. Wenn CreateDelegate aufgerufen wird, ist firstArgument ein NULL-Verweis. Der resultierende Delegat stellt eine offene statische Methode dar, und eine Instanz von C muss bei jedem Aufruf angegeben werden.

  • D kann eine statische Methode darstellen, die zum Typ F gehört und zwei Argumente besitzt, eines vom Typ F und eines vom Typ C. Wenn CreateDelegate aufgerufen wird, ist firstArgument eine Instanz von F. Der resultierende Delegat stellt eine statische Methode dar, die über dieser Instanz von F geschlossen ist. Beachten Sie, dass in dem Fall, dass F und C den gleichen Typ besitzen, die statische Methode zwei Argumente von diesem Typ besitzt. (In diesem Fall wird D über einem NULL-Verweis geschlossen, wenn firstArgumentein Nullverweis (Nothing in Visual Basic) ist.)

Dieser Abschnitt enthält drei Codebeispiele. Im ersten Beispiel werden die vier Arten von Delegaten veranschaulicht, die erstellt werden können: geschlossen über einer Instanzmethode, offen über einer Instanzmethode, offen über einer statische Methode und geschlossen über einer statischen Methode.

Im zweiten Codebeispiel werden kompatible Parametertypen und Rückgabetypen veranschaulicht.

Im dritten Codebeispiel wird ein einzelner Delegattyp definiert, und es werden alle Methoden veranschaulicht, die dieser Delegattyp darstellen kann.

Beispiel 1

Im folgenden Codebeispiel werden die vier Arten veranschaulicht, auf die ein Delegat mit dieser Überladung der CreateDelegate-Methode erstellt werden kann.

HinweisHinweis

Für die CreateDelegate-Methode sind zwei Überladungen vorhanden, die ein firstArgument und eine MethodInfo angeben. Sie besitzen die gleiche Funktion, mit dem Unterschied, dass bei der einen angegeben werden kann, ob ein Bindungsfehler ausgelöst werden soll, der bei der anderen immer ausgelöst wird. In diesem Codebeispiel werden beide Überladungen verwendet.

Im Beispiel werden die Klasse C mit der statischen Methode M2 und der Instanzmethode M1 sowie zwei Delegattypen deklariert: D1 akzeptiert eine Instanz von C und eine Zeichenfolge, D2 akzeptiert eine Zeichenfolge, und D3 akzeptiert keine Argumente.

Eine zweite Klasse mit dem Namen Example enthält den Code, in dem die Delegaten erstellt werden.

  • Ein Delegat des Typs D2, der über einer Instanz von C geschlossen ist, wird für die Instanzmethode M1 erstellt. Sie wird mit unterschiedlichen Zeichenfolgen aufgerufen, um zu veranschaulichen, dass die gebundene Instanz von C immer verwendet wird.

  • Ein Delegat des Typs D1, der eine offene Instanzmethode darstellt, wird für die Instanzmethode M1 erstellt. Beim Aufrufen des Delegaten muss eine Instanz muss übergeben werden.

  • Ein Delegat des Typs D2, der eine offene statische Methode darstellt, wird für die statische Methode M2 erstellt.

  • Schließlich wird ein Delegat des Typs D3, der über einer Zeichenfolge geschlossen ist, für die statische Methode M2 erstellt. Die Methode wird aufgerufen, um zu veranschaulichen, dass die gebundene Zeichenfolge verwendet wird.

Derzeit ist kein Code Beispiel verfügbar, oder die Sprache wird nicht unterstützt.

Beispiel 2

Im folgenden Codebeispiel wird die Kompatibilität von Parametertypen und Rückgabetypen veranschaulicht.

HinweisHinweis

Dieses Codebeispiel verwendet die CreateDelegate(Type, MethodInfo)-Methodenüberladung. Die Verwendung anderer Überladungen, die MethodInfo akzeptieren, ist ähnlich.

In diesem Codebeispiel wird eine Basisklasse mit dem Namen Base und eine Klasse mit dem Namen Derived definiert, die von Base abgeleitet ist. Die abgeleitete Klasse besitzt eine static-Methode (Shared in Visual Basic) mit dem Namen MyMethod und einem Parameter vom Typ Base sowie dem Rückgabetyp Derived. Im Codebeispiel wird außerdem ein Delegat mit dem Namen Example definiert, der einen Parameter vom Typ Derived und den Rückgabetyp Base besitzt.

Im Codebeispiel wird veranschaulicht, dass der Delegat mit dem Namen Example verwendet werden kann, um die Methode MyMethod darzustellen. Die Methode kann aus folgenden Gründen an den Delegaten gebunden werden:

  • Der Parametertyp des Delegaten (Derived) ist stärker eingeschränkt als der Parametertyp von MyMethod (Base), sodass das Argument des Delegaten immer sicher an MyMethod übergeben werden kann.

  • Der Rückgabetyp von MyMethod (Derived) ist stärker eingeschränkt als der Parametertyp des Delegaten (Base), sodass der Rückgabetyp der Methode immer sicher in den Rückgabetyp des Delegaten umgewandelt werden kann.

Im Codebeispiel wird keine Ausgabe erzeugt.


using namespace System;
using namespace System::Reflection;

// Define two classes to use in the demonstration, a base class and 
// a class that derives from it.
//
public ref class Base {};

public ref class Derived : Base
{
    // Define a static method to use in the demonstration. The method 
    // takes an instance of Base and returns an instance of Derived.  
    // For the purposes of the demonstration, it is not necessary for 
    // the method to do anything useful. 
    //
public:
    static Derived^ MyMethod(Base^ arg)
    {
        Base^ dummy = arg;
        return gcnew Derived();
    }
};

// Define a delegate that takes an instance of Derived and returns an
// instance of Base.
//
public delegate Base^ Example(Derived^ arg);

void main()
{
    // The binding flags needed to retrieve MyMethod.
    BindingFlags flags = BindingFlags::Public | BindingFlags::Static;

    // Get a MethodInfo that represents MyMethod.
    MethodInfo^ minfo = Derived::typeid->GetMethod("MyMethod", flags);

    // Demonstrate contravariance of parameter types and covariance
    // of return types by using the delegate Example to represent
    // MyMethod. The delegate binds to the method because the
    // parameter of the delegate is more restrictive than the 
    // parameter of the method (that is, the delegate accepts an
    // instance of Derived, which can always be safely passed to
    // a parameter of type Base), and the return type of MyMethod
    // is more restrictive than the return type of Example (that
    // is, the method returns an instance of Derived, which can
    // always be safely cast to type Base). 
    //
    Example^ ex = 
        (Example^) Delegate::CreateDelegate(Example::typeid, minfo);

    // Execute MyMethod using the delegate Example.
    //        
    Base^ b = ex(gcnew Derived());
}


Beispiel 3

Im folgenden Codebeispiel werden alle Methoden veranschaulicht, die ein einzelner Delegattyp darstellen kann.

HinweisHinweis

Für die CreateDelegate-Methode sind zwei Überladungen vorhanden, die ein firstArgument und eine MethodInfo angeben. Sie besitzen die gleiche Funktion, mit dem Unterschied, dass bei der einen angegeben werden kann, ob ein Bindungsfehler ausgelöst werden soll, der bei der anderen immer ausgelöst wird. In diesem Codebeispiel werden beide Überladungen verwendet.

Im Codebeispiel werden die beiden Klassen C und F und ein Delegattyp D mit einem Argument vom Typ C definiert. Die Klassen besitzen die übereinstimmenden statischen und Instanzmethoden M1, M3 and M4, und die Klasse C besitzt ebenfalls eine Instanzmethode M2, die keine Argumente besitzt.

Eine dritte Klasse mit dem Namen Example enthält den Code, in dem die Delegaten erstellt werden.

  • Delegaten werden für die Instanzmethode M1 vom Typ C und Typ F erstellt, die jeweils über einer Instanz des entsprechenden Typs geschlossen sind. Die Methode M1 des Typs C zeigt die ID-Eigenschaften der gebundenen Instanz und des Arguments an.

  • Ein Delegat wird für die Methode M2 des Typs C erstellt. Dies ist ein offener Instanzdelegat, in dem das Argument des Delegaten das verborgene erste Argument für die Instanzmethode darstellt. Die Methode verfügt über keine anderen Argumente.

  • Delegaten werden für die statischen Methoden M3 des Typs C und des Typs F erstellt, bei denen es sich um offene statische Delegaten handelt.

  • Schließlich werden Delegaten für die statischen Methoden M4 des Typs C und des Typs F erstellt. Jede Methode besitzt als erstes Argument den deklarierenden Typ, und eine Instanz des Typs wird angegeben, damit die Delegaten über dem ersten Argument geschlossen sind. Die Methode M4 des Typs C zeigt die ID-Eigenschaften der gebundenen Instanz und des Arguments an.

Derzeit ist kein Code Beispiel verfügbar, oder die Sprache wird nicht unterstützt.

.NET Framework

Unterstützt in: 4.5.2, 4.5.1, 4.5, 4, 3.5, 3.0, 2.0

.NET Framework Client Profile

Unterstützt in: 4, 3.5 SP1

.NET für Windows Phone-Apps

Unterstützt in: Windows Phone 8, Silverlight 8.1

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (Server Core-Rolle wird nicht unterstützt), Windows Server 2008 R2 (Server Core-Rolle wird mit SP1 oder höher unterstützt; Itanium wird nicht unterstützt)

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen für .NET Framework.

Community-Beiträge

HINZUFÜGEN
Anzeigen:
© 2015 Microsoft