Delegate.CreateDelegate Метод

Определение

Создает делегат указанного типа.Creates a delegate of the specified type.

Перегрузки

CreateDelegate(Type, Type, String, Boolean, Boolean)

Создает делегат заданного типа, представляющий заданный статический метод заданного класса с заданными установками учета регистра и поведением на случай, если операция связывания завершится неудачей.Creates a delegate of the specified type that represents the specified static method of the specified class, with the specified case-sensitivity and the specified behavior on failure to bind.

CreateDelegate(Type, Type, String, Boolean)

Создает делегат указанного типа, представляющий заданный статический метод заданного класса с заданной установкой учета регистра.Creates a delegate of the specified type that represents the specified static method of the specified class, with the specified case-sensitivity.

CreateDelegate(Type, Object, String, Boolean)

Создает делегат указанного типа, представляющий заданный метод экземпляра, который вызывается из заданного экземпляра класса с заданной установкой учета регистра.Creates a delegate of the specified type that represents the specified instance method to invoke on the specified class instance with the specified case-sensitivity.

CreateDelegate(Type, Object, MethodInfo, Boolean)

Создает делегат указанного типа, представляющий заданный статический метод или метод экземпляра, с заданным первым аргументом и поведением на случай, если операция связывания завершится неудачей.Creates a delegate of the specified type that represents the specified static or instance method, with the specified first argument and the specified behavior on failure to bind.

CreateDelegate(Type, Object, String, Boolean, Boolean)

Создает делегат указанного типа, представляющий заданный статический метод, вызываемый для заданного экземпляра класса с заданной установкой учета регистра и заданным поведением на случай, если операция связывания завершится неудачей.Creates a delegate of the specified type that represents the specified instance method to invoke on the specified class instance, with the specified case-sensitivity and the specified behavior on failure to bind.

CreateDelegate(Type, MethodInfo, Boolean)

Создает делегат указанного типа, представляющий заданный статический метод, с заданным поведением на случай, если операция связывания завершится неудачей.Creates a delegate of the specified type to represent the specified static method, with the specified behavior on failure to bind.

CreateDelegate(Type, Object, String)

Создает делегат указанного типа, представляющий заданный метод экземпляра, который вызывается для заданного экземпляра класса.Creates a delegate of the specified type that represents the specified instance method to invoke on the specified class instance.

CreateDelegate(Type, Object, MethodInfo)

Создает делегат указанного типа, представляющий заданный статический метод или метод экземпляра, с заданным первым аргументом.Creates a delegate of the specified type that represents the specified static or instance method, with the specified first argument.

CreateDelegate(Type, Type, String)

Создает делегат указанного типа, представляющий заданный статический метод заданного класса.Creates a delegate of the specified type that represents the specified static method of the specified class.

CreateDelegate(Type, MethodInfo)

Создает делегат указанного типа, представляющий заданный статический метод.Creates a delegate of the specified type to represent the specified static method.

CreateDelegate(Type, Type, String, Boolean, Boolean)

Создает делегат заданного типа, представляющий заданный статический метод заданного класса с заданными установками учета регистра и поведением на случай, если операция связывания завершится неудачей.Creates a delegate of the specified type that represents the specified static method of the specified class, with the specified case-sensitivity and the specified behavior on failure to bind.

public:
 static Delegate ^ CreateDelegate(Type ^ type, Type ^ target, System::String ^ method, bool ignoreCase, bool throwOnBindFailure);
public static Delegate CreateDelegate (Type type, Type target, string method, bool ignoreCase, bool throwOnBindFailure);
static member CreateDelegate : Type * Type * string * bool * bool -> Delegate

Параметры

type
Type

Тип Type создаваемого делегата.The Type of delegate to create.

target
Type

Тип Type, представляющий класс, в котором реализован метод method.The Type representing the class that implements method.

method
String

Имя статического метода, который должен быть представлен делегатом.The name of the static method that the delegate is to represent.

ignoreCase
Boolean

Логическое значение, указывающее, следует ли учитывать регистр при сравнении имени метода.A Boolean indicating whether to ignore the case when comparing the name of the method.

throwOnBindFailure
Boolean

Значение true для создания исключения, если метод method невозможно привязать; в противном случае — значение false.true to throw an exception if method cannot be bound; otherwise, false.

Возвраты

Делегат указанного типа, представляющий заданный статический метод заданного класса.A delegate of the specified type that represents the specified static method of the specified class.

Исключения

Свойство type имеет значение null.type is null.

- или --or- targetnull.target is null.

-или--or- methodnull.method is null.

type не является производным от MulticastDelegate.type does not inherit MulticastDelegate.

-или--or- type не является объектом типа RuntimeType.type is not a RuntimeType. См. статью Типы среды выполнения в отражении.See Runtime Types in Reflection.

- или --or- target не является объектом RuntimeType.target is not a RuntimeType.

-или--or- Параметр target является открытым универсальным типом.target is an open generic type. То есть свойство ContainsGenericParameters имеет значение true.That is, its ContainsGenericParameters property is true.

- или --or- method не является методом static (метод Shared в Visual Basic).method is not a static method (Shared method in Visual Basic).

- или --or- Параметр method невозможно привязать, например, потому, что его невозможно найти, а throwOnBindFailure имеет значение true.method cannot be bound, for example because it cannot be found, and throwOnBindFailure is true.

Метод Invoke для type не найден.The Invoke method of type is not found.

Вызывающий объект не имеет необходимых разрешений для доступа к method.The caller does not have the permissions necessary to access method.

Комментарии

Этот метод создает делегаты только для статических методов.This method creates delegates for static methods only. Метод экземпляра — это метод, связанный с экземпляром класса; статический метод — это метод, который связан с самим классом.An instance method is a method that is associated with an instance of a class; a static method is a method that is associated with the class itself.

Примечание

Начиная с .NET Framework 2.0 с пакетом обновления 1 (SP1).NET Framework 2.0 Service Pack 1, этот метод можно использовать для доступа к закрытым методам, если вызывающему объекту был предоставлен ReflectionPermission ReflectionPermissionFlag.RestrictedMemberAccess флаг, и если набор разрешений неоткрытых методов ограничен набором предоставления вызывающего объекта или подмножеством сочетани.Starting with the .NET Framework 2.0 с пакетом обновления 1 (SP1).NET Framework 2.0 Service Pack 1, this method can be used to access non-public methods if the caller has been granted ReflectionPermission with the ReflectionPermissionFlag.RestrictedMemberAccess flag and if the grant set of the non-public methods is restricted to the caller's grant set, or a subset thereof. (См. раздел вопросы безопасности для отражения.)(See Security Considerations for Reflection.)

Для применения этих функциональных возможностей приложение должно использовать .NET Framework 3,5.NET Framework 3.5 или более поздние версии.To use this functionality, your application should target the .NET Framework 3,5.NET Framework 3.5 or later.

Безопасность

ReflectionPermission
При вызове поздней привязки с помощью таких механизмов InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]), как.when invoked late-bound through mechanisms such as InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]). Связанное перечисление: MemberAccess.Associated enumeration: MemberAccess.

Дополнительно

CreateDelegate(Type, Type, String, Boolean)

Создает делегат указанного типа, представляющий заданный статический метод заданного класса с заданной установкой учета регистра.Creates a delegate of the specified type that represents the specified static method of the specified class, with the specified case-sensitivity.

public:
 static Delegate ^ CreateDelegate(Type ^ type, Type ^ target, System::String ^ method, bool ignoreCase);
public static Delegate CreateDelegate (Type type, Type target, string method, bool ignoreCase);
static member CreateDelegate : Type * Type * string * bool -> Delegate

Параметры

type
Type

Тип Type создаваемого делегата.The Type of delegate to create.

target
Type

Тип Type, представляющий класс, в котором реализован метод method.The Type representing the class that implements method.

method
String

Имя статического метода, который должен быть представлен делегатом.The name of the static method that the delegate is to represent.

ignoreCase
Boolean

Логическое значение, указывающее, следует ли учитывать регистр при сравнении имени метода.A Boolean indicating whether to ignore the case when comparing the name of the method.

Возвраты

Делегат указанного типа, представляющий заданный статический метод заданного класса.A delegate of the specified type that represents the specified static method of the specified class.

Исключения

Свойство type имеет значение null.type is null.

-или--or- Свойство target имеет значение null.target is null.

- или --or- Свойство method имеет значение null.method is null.

type не является производным от MulticastDelegate.type does not inherit MulticastDelegate.

- или --or- type не является объектом типа RuntimeType.type is not a RuntimeType. См. статью Типы среды выполнения в отражении.See Runtime Types in Reflection.

- или --or- target не является объектом RuntimeType.target is not a RuntimeType.

- или --or- Параметр target является открытым универсальным типом.target is an open generic type. То есть свойство ContainsGenericParameters имеет значение true.That is, its ContainsGenericParameters property is true.

- или --or- method не является методом static (метод Shared в Visual Basic).method is not a static method (Shared method in Visual Basic).

-или--or- Параметр method невозможно привязать, например, потому, что его не удалось найти.method cannot be bound, for example because it cannot be found.

Метод Invoke для type не найден.The Invoke method of type is not found.

Вызывающий объект не имеет необходимых разрешений для доступа к method.The caller does not have the permissions necessary to access method.

Комментарии

Этот метод создает делегаты только для статических методов.This method creates delegates for static methods only. Метод экземпляра — это метод, связанный с экземпляром класса; статический метод — это метод, который связан с самим классом.An instance method is a method that is associated with an instance of a class; a static method is a method that is associated with the class itself.

Перегрузка этого метода эквивалентна вызову CreateDelegate(Type, Type, String, Boolean, Boolean) перегрузки метода, задающей true для throwOnBindFailure.This method overload is equivalent to calling the CreateDelegate(Type, Type, String, Boolean, Boolean) method overload, specifying true for throwOnBindFailure.

Примечание

Начиная с .NET Framework 2.0 с пакетом обновления 1 (SP1).NET Framework 2.0 Service Pack 1, этот метод можно использовать для доступа к закрытым методам, если вызывающему объекту был предоставлен ReflectionPermission ReflectionPermissionFlag.RestrictedMemberAccess флаг, и если набор разрешений неоткрытых методов ограничен набором предоставления вызывающего объекта или подмножеством сочетани.Starting with the .NET Framework 2.0 с пакетом обновления 1 (SP1).NET Framework 2.0 Service Pack 1, this method can be used to access non-public methods if the caller has been granted ReflectionPermission with the ReflectionPermissionFlag.RestrictedMemberAccess flag and if the grant set of the non-public methods is restricted to the caller's grant set, or a subset thereof. (См. раздел вопросы безопасности для отражения.)(See Security Considerations for Reflection.)

Для применения этих функциональных возможностей приложение должно использовать .NET Framework 3,5.NET Framework 3.5 или более поздние версии.To use this functionality, your application should target the .NET Framework 3,5.NET Framework 3.5 or later.

Безопасность

ReflectionPermission
При вызове поздней привязки с помощью таких механизмов InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]), как.when invoked late-bound through mechanisms such as InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]). Связанное перечисление: MemberAccess.Associated enumeration: MemberAccess.

Дополнительно

CreateDelegate(Type, Object, String, Boolean)

Создает делегат указанного типа, представляющий заданный метод экземпляра, который вызывается из заданного экземпляра класса с заданной установкой учета регистра.Creates a delegate of the specified type that represents the specified instance method to invoke on the specified class instance with the specified case-sensitivity.

public:
 static Delegate ^ CreateDelegate(Type ^ type, System::Object ^ target, System::String ^ method, bool ignoreCase);
public static Delegate CreateDelegate (Type type, object target, string method, bool ignoreCase);
static member CreateDelegate : Type * obj * string * bool -> Delegate

Параметры

type
Type

Тип Type создаваемого делегата.The Type of delegate to create.

target
Object

Экземпляр класса, для которого вызывается метод method.The class instance on which method is invoked.

method
String

Имя метода экземпляра, который должен быть представлен делегатом.The name of the instance method that the delegate is to represent.

ignoreCase
Boolean

Логическое значение, указывающее, следует ли учитывать регистр при сравнении имени метода.A Boolean indicating whether to ignore the case when comparing the name of the method.

Возвраты

Создает делегат указанного типа, представляющий заданный метод экземпляра, который вызывается для заданного экземпляра класса.A delegate of the specified type that represents the specified instance method to invoke on the specified class instance.

Исключения

Свойство type имеет значение null.type is null.

- или --or- Свойство target имеет значение null.target is null.

-или--or- Свойство method имеет значение null.method is null.

type не является производным от MulticastDelegate.type does not inherit MulticastDelegate.

-или--or- type не является объектом типа RuntimeType.type is not a RuntimeType. См. статью Типы среды выполнения в отражении.See Runtime Types in Reflection.

-или--or- method не является методом экземпляра.method is not an instance method.

- или --or- Параметр method невозможно привязать, например, потому, что его не удалось найти.method cannot be bound, for example because it cannot be found.

Метод Invoke для type не найден.The Invoke method of type is not found.

Вызывающий объект не имеет необходимых разрешений для доступа к method.The caller does not have the permissions necessary to access method.

Комментарии

Этот метод создает делегаты только для методов экземпляра.This method creates delegates for instance methods only. Метод экземпляра — это метод, связанный с экземпляром класса; статический метод — это метод, который связан с самим классом.An instance method is a method that is associated with an instance of a class; a static method is a method that is associated with the class itself.

Перегрузка этого метода эквивалентна вызову CreateDelegate(Type, Object, String, Boolean, Boolean) перегрузки метода, задающей true для throwOnBindFailure.This method overload is equivalent to calling the CreateDelegate(Type, Object, String, Boolean, Boolean) method overload, specifying true for throwOnBindFailure.

Примечание

Начиная с .NET Framework 2.0 с пакетом обновления 1 (SP1).NET Framework 2.0 Service Pack 1, этот метод можно использовать для доступа к закрытым методам, если вызывающему объекту был предоставлен ReflectionPermission ReflectionPermissionFlag.RestrictedMemberAccess флаг, и если набор разрешений неоткрытых методов ограничен набором предоставления вызывающего объекта или подмножеством сочетани.Starting with the .NET Framework 2.0 с пакетом обновления 1 (SP1).NET Framework 2.0 Service Pack 1, this method can be used to access non-public methods if the caller has been granted ReflectionPermission with the ReflectionPermissionFlag.RestrictedMemberAccess flag and if the grant set of the non-public methods is restricted to the caller's grant set, or a subset thereof. (См. раздел вопросы безопасности для отражения.)(See Security Considerations for Reflection.)

Для применения этих функциональных возможностей приложение должно использовать .NET Framework 3,5.NET Framework 3.5 или более поздние версии.To use this functionality, your application should target the .NET Framework 3,5.NET Framework 3.5 or later.

Безопасность

ReflectionPermission
При вызове поздней привязки с помощью таких механизмов InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]), как.when invoked late-bound through mechanisms such as InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]). Связанное перечисление: MemberAccess.Associated enumeration: MemberAccess.

Дополнительно

CreateDelegate(Type, Object, MethodInfo, Boolean)

Создает делегат указанного типа, представляющий заданный статический метод или метод экземпляра, с заданным первым аргументом и поведением на случай, если операция связывания завершится неудачей.Creates a delegate of the specified type that represents the specified static or instance method, with the specified first argument and the specified behavior on failure to bind.

public:
 static Delegate ^ CreateDelegate(Type ^ type, System::Object ^ firstArgument, System::Reflection::MethodInfo ^ method, bool throwOnBindFailure);
public static Delegate CreateDelegate (Type type, object firstArgument, System.Reflection.MethodInfo method, bool throwOnBindFailure);
static member CreateDelegate : Type * obj * System.Reflection.MethodInfo * bool -> Delegate

Параметры

type
Type

Объект Type, представляющий тип создаваемого делегата.A Type representing the type of delegate to create.

firstArgument
Object

Object, являющийся первым аргументом метода, представленного делегатом.An Object that is the first argument of the method the delegate represents. Для методов экземпляра он должен быть совместим с типом экземпляра.For instance methods, it must be compatible with the instance type.

method
MethodInfo

Объект MethodInfo, описывающий статический метод или метод экземпляра, который будет представлен делегатом.The MethodInfo describing the static or instance method the delegate is to represent.

throwOnBindFailure
Boolean

Значение true для создания исключения, если метод method невозможно привязать; в противном случае — значение false.true to throw an exception if method cannot be bound; otherwise, false.

Возвраты

Делегат заданного типа, представляющий указанный статический метод или метод экземпляра, либо значение null, если значение параметра throwOnBindFailure равно false и делегат не удалось связать с методом method.A delegate of the specified type that represents the specified static or instance method, or null if throwOnBindFailure is false and the delegate cannot be bound to method.

Исключения

Свойство type имеет значение null.type is null.

- или --or- methodnull.method is null.

type не является производным от MulticastDelegate.type does not inherit MulticastDelegate.

-или--or- type не является объектом типа RuntimeType.type is not a RuntimeType. См. статью Типы среды выполнения в отражении.See Runtime Types in Reflection.

- или --or- method невозможно привязать, и throwOnBindFailure имеет значение true.method cannot be bound, and throwOnBindFailure is true.

- или --or- method не является объектом типа RuntimeMethodInfo.method is not a RuntimeMethodInfo. См. статью Типы среды выполнения в отражении.See Runtime Types in Reflection.

Метод Invoke типа type не найден.The Invoke method of type is not found.

Вызывающий объект не имеет необходимых разрешений для доступа к method.The caller does not have the permissions necessary to access method.

Примеры

Этот раздел содержит три примера кода.This section contains three code examples. В первом примере показаны четыре типа делегатов, которые могут быть созданы: закрыто над методом экземпляра, открыто через метод экземпляра, открыто через статический метод и закрыто по статическому методу.The first example demonstrates the four kinds of delegates that can be created: closed over an instance method, open over an instance method, open over a static method, and closed over a static method.

Во втором примере кода демонстрируются совместимые типы параметров и возвращаемые типы.The second code example demonstrates compatible parameter types and return types.

В третьем примере кода определяется один тип делегата и отображаются все методы, которые могут представляться типом делегата.The third code example defines a single delegate type, and shows all the methods that delegate type can represent.

Пример 1Example 1

В следующем примере кода показаны четыре способа создания делегата с помощью этой перегрузки CreateDelegate метода.The following code example demonstrates the four ways a delegate can be created using this overload of the CreateDelegate method.

Примечание

Существует две перегрузки CreateDelegate метода, которые задают firstArgument и MethodInfo; их функциональные возможности одинаковы, за исключением того, что позволяет указать, следует ли создавать привязку при ошибке, а вторая всегда создает исключение.There are two overloads of the CreateDelegate method that specify firstArgument and a MethodInfo; their functionality is the same except that one allows you to specify whether to throw on failure to bind, and the other always throws. В этом примере кода используются обе перегрузки.This code example uses both overloads.

В примере объявляется C класс со статическим методом M2 и методом M1экземпляра, а также C три типа делегата: D1 принимает экземпляр и строку, D2 принимает строку и D3не имеет аргументов.The example declares a class C with a static method M2 and an instance method M1, and three delegate types: D1 takes an instance of C and a string, D2 takes a string, and D3 has no arguments.

Второй класс с именем Example содержит код, создающий делегаты.A second class named Example contains the code that creates the delegates.

  • Делегат типа D2, закрытый над Cэкземпляром, создается для метода M1экземпляра.A delegate of type D2, closed over an instance of C, is created for the instance method M1. Он вызывается с разными строками, чтобы продемонстрировать, что привязанный экземпляр C всегда используется.It is invoked with different strings, to show that the bound instance of C is always used.

  • Делегат типа D1, представляющий открытый метод экземпляра, создается для метода M1экземпляра.A delegate of type D1, representing an open instance method, is created for the instance method M1. Экземпляр должен передаваться при вызове делегата.An instance must be passed when the delegate is invoked.

  • Для статического метода M2создается D2делегат типа, представляющий открытый статический метод.A delegate of type D2, representing an open static method, is created for the static method M2.

  • Наконец, для статического метода D3 M2создается делегат типа, закрытый над строкой.Finally, a delegate of type D3, closed over a string, is created for the static method M2. Метод вызывается, чтобы продемонстрировать, что он использует привязанную строку.The method is invoked to show that it uses the bound string.

using System;
using System.Reflection;
using System.Security.Permissions;

// Declare three delegate types for demonstrating the combinations
// of static versus instance methods and open versus closed
// delegates.
//
public delegate void D1(C c, string s);
public delegate void D2(string s);
public delegate void D3();

// A sample class with an instance method and a static method.
//
public class C
{
    private int id;
    public C(int id) { this.id = id; }

    public void M1(string s) 
    { 
        Console.WriteLine("Instance method M1 on C:  id = {0}, s = {1}",
            this.id, s);
    }
  
    public static void M2(string s)
    { 
        Console.WriteLine("Static method M2 on C:  s = {0}", s); 
    }
}

public class Example
{
    public static void Main()
    {
        C c1 = new C(42);

        // Get a MethodInfo for each method.
        //
        MethodInfo mi1 = typeof(C).GetMethod("M1", 
            BindingFlags.Public | BindingFlags.Instance);
        MethodInfo mi2 = typeof(C).GetMethod("M2",
            BindingFlags.Public | BindingFlags.Static);

        D1 d1;
        D2 d2;
        D3 d3;


        Console.WriteLine("\nAn instance method closed over C.");
        // In this case, the delegate and the
        // method must have the same list of argument types; use
        // delegate type D2 with instance method M1.
        //
        Delegate test = 
            Delegate.CreateDelegate(typeof(D2), c1, mi1, false);

        // Because false was specified for throwOnBindFailure 
        // in the call to CreateDelegate, the variable 'test'
        // contains null if the method fails to bind (for 
        // example, if mi1 happened to represent a method of  
        // some class other than C).
        //
        if (test != null)
        {
            d2 = (D2) test;

            // The same instance of C is used every time the 
            // delegate is invoked.
            d2("Hello, World!");
            d2("Hi, Mom!");
        }


        Console.WriteLine("\nAn open instance method.");
        // In this case, the delegate has one more 
        // argument than the instance method; this argument comes
        // at the beginning, and represents the hidden instance
        // argument of the instance method. Use delegate type D1
        // with instance method M1.
        //
        d1 = (D1) Delegate.CreateDelegate(typeof(D1), null, mi1);

        // An instance of C must be passed in each time the 
        // delegate is invoked.
        //
        d1(c1, "Hello, World!");
        d1(new C(5280), "Hi, Mom!");


        Console.WriteLine("\nAn open static method.");
        // In this case, the delegate and the method must 
        // have the same list of argument types; use delegate type
        // D2 with static method M2.
        //
        d2 = (D2) Delegate.CreateDelegate(typeof(D2), null, mi2);

        // No instances of C are involved, because this is a static
        // method. 
        //
        d2("Hello, World!");
        d2("Hi, Mom!");


        Console.WriteLine("\nA static method closed over the first argument (String).");
        // The delegate must omit the first argument of the method.
        // A string is passed as the firstArgument parameter, and 
        // the delegate is bound to this string. Use delegate type 
        // D3 with static method M2. 
        //
        d3 = (D3) Delegate.CreateDelegate(typeof(D3), 
            "Hello, World!", mi2);

        // Each time the delegate is invoked, the same string is
        // used.
        d3();
    }
}

/* This code example produces the following output:

An instance method closed over C.
Instance method M1 on C:  id = 42, s = Hello, World!
Instance method M1 on C:  id = 42, s = Hi, Mom!

An open instance method.
Instance method M1 on C:  id = 42, s = Hello, World!
Instance method M1 on C:  id = 5280, s = Hi, Mom!

An open static method.
Static method M2 on C:  s = Hello, World!
Static method M2 on C:  s = Hi, Mom!

A static method closed over the first argument (String).
Static method M2 on C:  s = Hello, World!
 */
Imports System.Reflection
Imports System.Security.Permissions

' Declare three delegate types for demonstrating the combinations
' of Shared versus instance methods and open versus closed
' delegates.
'
Public Delegate Sub D1(ByVal c As C, ByVal s As String) 
Public Delegate Sub D2(ByVal s As String) 
Public Delegate Sub D3() 

' A sample class with an instance method and a Shared method.
'
Public Class C
    Private id As Integer
    Public Sub New(ByVal id As Integer) 
        Me.id = id
    End Sub

    Public Sub M1(ByVal s As String) 
        Console.WriteLine("Instance method M1 on C:  id = {0}, s = {1}", _
            Me.id, s)
    End Sub
    
    Public Shared Sub M2(ByVal s As String) 
        Console.WriteLine("Shared method M2 on C:  s = {0}", s)
    End Sub
End Class

Public Class Example
    
    Public Shared Sub Main() 

        Dim c1 As New C(42)
        
        ' Get a MethodInfo for each method.
        '
        Dim mi1 As MethodInfo = GetType(C).GetMethod("M1", _
            BindingFlags.Public Or BindingFlags.Instance)
        Dim mi2 As MethodInfo = GetType(C).GetMethod("M2", _
            BindingFlags.Public Or BindingFlags.Static)
        
        Dim d1 As D1
        Dim d2 As D2
        Dim d3 As D3
        
        
        Console.WriteLine(vbLf & "An instance method closed over C.")
        ' In this case, the delegate and the
        ' method must have the same list of argument types; use
        ' delegate type D2 with instance method M1.
        '
        Dim test As [Delegate] = _
            [Delegate].CreateDelegate(GetType(D2), c1, mi1, False)

        ' Because False was specified for throwOnBindFailure 
        ' in the call to CreateDelegate, the variable 'test'
        ' contains Nothing if the method fails to bind (for 
        ' example, if mi1 happened to represent a method of 
        ' some class other than C).
        '
        If test IsNot Nothing Then
            d2 = CType(test, D2)

            ' The same instance of C is used every time the
            ' delegate is invoked.
            d2("Hello, World!")
            d2("Hi, Mom!")
        End If
        
        
        Console.WriteLine(vbLf & "An open instance method.")
        ' In this case, the delegate has one more 
        ' argument than the instance method; this argument comes
        ' at the beginning, and represents the hidden instance
        ' argument of the instance method. Use delegate type D1
        ' with instance method M1.
        '
        d1 = CType([Delegate].CreateDelegate(GetType(D1), Nothing, mi1), D1)
        
        ' An instance of C must be passed in each time the 
        ' delegate is invoked.
        '
        d1(c1, "Hello, World!")
        d1(New C(5280), "Hi, Mom!")
        
        
        Console.WriteLine(vbLf & "An open Shared method.")
        ' In this case, the delegate and the method must 
        ' have the same list of argument types; use delegate type
        ' D2 with Shared method M2.
        '
        d2 = CType([Delegate].CreateDelegate(GetType(D2), Nothing, mi2), D2)
        
        ' No instances of C are involved, because this is a Shared
        ' method. 
        '
        d2("Hello, World!")
        d2("Hi, Mom!")
        
        
        Console.WriteLine(vbLf & "A Shared method closed over the first argument (String).")
        ' The delegate must omit the first argument of the method.
        ' A string is passed as the firstArgument parameter, and 
        ' the delegate is bound to this string. Use delegate type 
        ' D3 with Shared method M2. 
        '
        d3 = CType([Delegate].CreateDelegate(GetType(D3), "Hello, World!", mi2), D3)
        
        ' Each time the delegate is invoked, the same string is
        ' used.
        d3()
    
    End Sub
End Class

' This code example produces the following output:
'
'An instance method closed over C.
'Instance method M1 on C:  id = 42, s = Hello, World!
'Instance method M1 on C:  id = 42, s = Hi, Mom!
'
'An open instance method.
'Instance method M1 on C:  id = 42, s = Hello, World!
'Instance method M1 on C:  id = 5280, s = Hi, Mom!
'
'An open Shared method.
'Shared method M2 on C:  s = Hello, World!
'Shared method M2 on C:  s = Hi, Mom!
'
'A Shared method closed over the first argument (String).
'Shared method M2 on C:  s = Hello, World!
' 

Пример 2Example 2

В следующем примере кода демонстрируется совместимость типов параметров и возвращаемых типов.The following code example demonstrates compatibility of parameter types and return types.

Примечание

В CreateDelegate(Type, MethodInfo) этом примере кода используется перегрузка метода.This code example uses the CreateDelegate(Type, MethodInfo) method overload. Использование других перегрузок, которые принимаются MethodInfo , аналогично.The use of other overloads that take MethodInfo is similar.

В примере кода определяется базовый класс с именем Base и Derived класс, производный от Base.The code example defines a base class named Base and a class named Derived that derives from Base. Производный static класс имеет метод (Shared в Visual Basic) с именем MyMethod с одним параметром типа Base и типом возвращаемого значения Derived.The derived class has a static (Shared in Visual Basic) method named MyMethod with one parameter of type Base and a return type of Derived. В примере кода также определяется делегат с именем Example с одним параметром типа Derived и типом возвращаемого значения Base.The code example also defines a delegate named Example that has one parameter of type Derived and a return type of Base.

В примере кода показано, что для представления Example метода MyMethodможно использовать делегат с именем.The code example demonstrates that the delegate named Example can be used to represent the method MyMethod. Метод можно привязать к делегату по следующим причинам:The method can be bound to the delegate because:

  • ТипDerivedпараметра делегата () более ограничен, чем MyMethod тип параметра (Base), чтобы всегда быть уверенным MyMethodв передаче аргумента делегата.The parameter type of the delegate (Derived) is more restrictive than the parameter type of MyMethod (Base), so that it is always safe to pass the argument of the delegate to MyMethod.

  • Тип возвращаемого значения MyMethod (Derived) является более строгой, чем тип параметра делегата (Base), чтобы всегда быть уверенным в том, чтобы привести возвращаемый тип метода к возвращаемому типу делегата.The return type of MyMethod (Derived) is more restrictive than the parameter type of the delegate (Base), so that it is always safe to cast the return type of the method to the return type of the delegate.

В примере кода выходные данные не создаются.The code example produces no output.

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());
}
using System;
using System.Reflection;

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

public 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 new Derived();
    }
}

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

class Test
{
    public static void Main()
    {
        // The binding flags needed to retrieve MyMethod.
        BindingFlags flags = BindingFlags.Public | BindingFlags.Static;

        // Get a MethodInfo that represents MyMethod.
        MethodInfo minfo = typeof(Derived).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(typeof(Example), minfo);

        // Execute MyMethod using the delegate Example.
        //        
        Base b = ex(new Derived());
    }
}
Imports System.Reflection

' Define two classes to use in the demonstration, a base class and 
' a class that derives from it.
'
Public Class Base
End Class

Public Class Derived
    Inherits Base

    ' Define a Shared 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 Shared Function MyMethod(ByVal arg As Base) As Derived
        Dim dummy As Base = arg
        Return New Derived()
    End Function

End Class

' Define a delegate that takes an instance of Derived and returns an
' instance of Base.
'
Public Delegate Function Example(ByVal arg As Derived) As Base

Module Test

    Sub Main()

        ' The binding flags needed to retrieve MyMethod.
        Dim flags As BindingFlags = _
            BindingFlags.Public Or BindingFlags.Static

        ' Get a MethodInfo that represents MyMethod.
        Dim minfo As MethodInfo = _
            GetType(Derived).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). 
        '
        Dim ex As Example = CType( _
            [Delegate].CreateDelegate(GetType(Example), minfo), _
            Example _
        )

        ' Execute MyMethod using the delegate Example.
        '        
        Dim b As Base = ex(New Derived())
    End Sub
End Module

Пример 3Example 3

В следующем примере кода показаны все методы, которые может представлять один тип делегата.The following code example shows all the methods a single delegate type can represent.

Примечание

Существует две перегрузки CreateDelegate метода, которые задают firstArgument и MethodInfo; их функциональные возможности одинаковы, за исключением того, что позволяет указать, следует ли создавать привязку при ошибке, а вторая всегда создает исключение.There are two overloads of the CreateDelegate method that specify firstArgument and a MethodInfo; their functionality is the same except that one allows you to specify whether to throw on failure to bind, and the other always throws. В этом примере кода используются обе перегрузки.This code example uses both overloads.

В примере кода определяются два класса C : Fи, и тип D делегата с одним аргументом Cтипа.The code example defines two classes, C and F, and a delegate type D with one argument of type C. Классы имеют совпадающие статические методы и M1метод M3экземпляра, M4, и, C а класс также имеет метод M2 экземпляра, не имеющий аргументов.The classes have matching static and instance methods M1, M3, and M4, and class C also has an instance method M2 that has no arguments.

Третий класс с именем Example содержит код, создающий делегаты.A third class named Example contains the code that creates the delegates.

  • Делегаты создаются для метода M1 экземпляра типа C и типа F, каждый из которых закрыт для экземпляра соответствующего типа.Delegates are created for instance method M1 of type C and type F; each is closed over an instance of the respective type. Метод M1 типа C отображаетID свойства привязанного экземпляра и аргумента.Method M1 of type C displays the ID properties of the bound instance and of the argument.

  • Делегат создается для метода M2 типа. CA delegate is created for method M2 of type C. Это делегат открытого экземпляра, в котором аргумент делегата представляет собой скрытый первый аргумент в методе экземпляра.This is an open instance delegate, in which the argument of the delegate represents the hidden first argument on the instance method. Метод не имеет других аргументов.The method has no other arguments.

  • Делегаты создаются для статического метода M3 типа C и типа F. это открытые статические делегаты.Delegates are created for static method M3 of type C and type F; these are open static delegates.

  • Наконец, делегаты создаются для статического метода M4 типа C и типа F; каждый метод имеет объявляющий тип в качестве первого аргумента и предоставляется экземпляр типа, поэтому делегаты закрываются по первым аргументам. .Finally, delegates are created for static method M4 of type C and type F; each method has the declaring type as its first argument, and an instance of the type is supplied, so the delegates are closed over their first arguments. Метод M4 типа C отображаетID свойства привязанного экземпляра и аргумента.Method M4 of type C displays the ID properties of the bound instance and of the argument.

using System;
using System.Reflection;
using System.Security.Permissions;

// Declare a delegate type. The object of this code example
// is to show all the methods this delegate can bind to.
//
public delegate void D(C c);

// Declare two sample classes, C and F. Class C has an ID
// property so instances can be identified.
//
public class C
{
    private int id;
    public int ID { get { return id; }}
    public C(int id) { this.id = id; }

    public void M1(C c) 
    { 
        Console.WriteLine("Instance method M1(C c) on C:  this.id = {0}, c.ID = {1}",
            this.id, c.ID);
    }
  
    public void M2() 
    { 
        Console.WriteLine("Instance method M2() on C:  this.id = {0}",
            this.id);
    }
  
    public static void M3(C c)
    { 
        Console.WriteLine("Static method M3(C c) on C:  c.ID = {0}", c.ID); 
    }

    public static void M4(C c1, C c2) 
    { 
        Console.WriteLine("Static method M4(C c1, C c2) on C:  c1.ID = {0}, c2.ID = {1}",
            c1.ID, c2.ID);
    }
}

public class F
{
    public void M1(C c) 
    { 
        Console.WriteLine("Instance method M1(C c) on F:  c.ID = {0}",
            c.ID);
    }
  
    public static void M3(C c)
    { 
        Console.WriteLine("Static method M3(C c) on F:  c.ID = {0}", c.ID); 
    }

    public static void M4(F f, C c) 
    { 
        Console.WriteLine("Static method M4(F f, C c) on F:  c.ID = {0}",
            c.ID);
    }
}


public class Example
{
    public static void Main()
    {
        C c1 = new C(42);
        C c2 = new C(1491);
        F f1 = new F();

        D d;

        // Instance method with one argument of type C.
        MethodInfo cmi1 = typeof(C).GetMethod("M1"); 
        // Instance method with no arguments.
        MethodInfo cmi2 = typeof(C).GetMethod("M2"); 
        // Static method with one argument of type C.
        MethodInfo cmi3 = typeof(C).GetMethod("M3"); 
        // Static method with two arguments of type C.
        MethodInfo cmi4 = typeof(C).GetMethod("M4"); 

        // Instance method with one argument of type C.
        MethodInfo fmi1 = typeof(F).GetMethod("M1");
        // Static method with one argument of type C.
        MethodInfo fmi3 = typeof(F).GetMethod("M3"); 
        // Static method with an argument of type F and an argument 
        // of type C.
        MethodInfo fmi4 = typeof(F).GetMethod("M4"); 

        Console.WriteLine("\nAn instance method on any type, with an argument of type C.");
        // D can represent any instance method that exactly matches its
        // signature. Methods on C and F are shown here.
        //
        d = (D) Delegate.CreateDelegate(typeof(D), c1, cmi1);
        d(c2);
        d = (D) Delegate.CreateDelegate(typeof(D), f1, fmi1);
        d(c2);

        Console.WriteLine("\nAn instance method on C with no arguments.");
        // D can represent an instance method on C that has no arguments;
        // in this case, the argument of D represents the hidden first
        // argument of any instance method. The delegate acts like a 
        // static method, and an instance of C must be passed each time
        // it is invoked.
        //
        d = (D) Delegate.CreateDelegate(typeof(D), null, cmi2);
        d(c1);

        Console.WriteLine("\nA static method on any type, with an argument of type C.");
        // D can represent any static method with the same signature.
        // Methods on F and C are shown here.
        //
        d = (D) Delegate.CreateDelegate(typeof(D), null, cmi3);
        d(c1);
        d = (D) Delegate.CreateDelegate(typeof(D), null, fmi3);
        d(c1);

        Console.WriteLine("\nA static method on any type, with an argument of");
        Console.WriteLine("    that type and an argument of type C.");
        // D can represent any static method with one argument of the
        // type the method belongs and a second argument of type C.
        // In this case, the method is closed over the instance of
        // supplied for the its first argument, and acts like an instance
        // method. Methods on F and C are shown here.
        //
        d = (D) Delegate.CreateDelegate(typeof(D), c1, cmi4);
        d(c2);
        Delegate test = 
            Delegate.CreateDelegate(typeof(D), f1, fmi4, false);

        // This final example specifies false for throwOnBindFailure 
        // in the call to CreateDelegate, so the variable 'test'
        // contains Nothing if the method fails to bind (for 
        // example, if fmi4 happened to represent a method of  
        // some class other than F).
        //
        if (test != null)
        {
            d = (D) test;
            d(c2);
        }
    }
}

/* This code example produces the following output:

An instance method on any type, with an argument of type C.
Instance method M1(C c) on C:  this.id = 42, c.ID = 1491
Instance method M1(C c) on F:  c.ID = 1491

An instance method on C with no arguments.
Instance method M2() on C:  this.id = 42

A static method on any type, with an argument of type C.
Static method M3(C c) on C:  c.ID = 42
Static method M3(C c) on F:  c.ID = 42

A static method on any type, with an argument of
    that type and an argument of type C.
Static method M4(C c1, C c2) on C:  c1.ID = 42, c2.ID = 1491
Static method M4(F f, C c) on F:  c.ID = 1491
*/
Imports System.Reflection
Imports System.Security.Permissions

' Declare a delegate type. The object of this code example
' is to show all the methods this delegate can bind to.
'
Public Delegate Sub D(ByVal c As C) 

' Declare two sample classes, C and F. Class C has an ID
' property so instances can be identified.
'
Public Class C

    Private _id As Integer

    Public ReadOnly Property ID() As Integer 
        Get
            Return _id
        End Get
    End Property

    Public Sub New(ByVal newId As Integer) 
        Me._id = newId
    End Sub
    
    Public Sub M1(ByVal c As C) 
        Console.WriteLine("Instance method M1(c As C) on C:  this.id = {0}, c.ID = {1}", _
            Me.id, c.ID)
    End Sub
    
    Public Sub M2() 
        Console.WriteLine("Instance method M2() on C:  this.id = {0}", Me.id)
    End Sub
    
    Public Shared Sub M3(ByVal c As C) 
        Console.WriteLine("Shared method M3(c As C) on C:  c.ID = {0}", c.ID)
    End Sub
    
    Public Shared Sub M4(ByVal c1 As C, ByVal c2 As C) 
        Console.WriteLine("Shared method M4(c1 As C, c2 As C) on C:  c1.ID = {0}, c2.ID = {1}", _
            c1.ID, c2.ID)
    End Sub
End Class


Public Class F
    
    Public Sub M1(ByVal c As C) 
        Console.WriteLine("Instance method M1(c As C) on F:  c.ID = {0}", c.ID)
    End Sub
    
    Public Shared Sub M3(ByVal c As C) 
        Console.WriteLine("Shared method M3(c As C) on F:  c.ID = {0}", c.ID)
    End Sub
    
    Public Shared Sub M4(ByVal f As F, ByVal c As C) 
        Console.WriteLine("Shared method M4(f As F, c As C) on F:  c.ID = {0}", c.ID)
    End Sub
End Class

Public Class Example
    
    Public Shared Sub Main() 

        Dim c1 As New C(42)
        Dim c2 As New C(1491)
        Dim f1 As New F()
        
        Dim d As D
        
        ' Instance method with one argument of type C.
        Dim cmi1 As MethodInfo = GetType(C).GetMethod("M1")
        ' Instance method with no arguments.
        Dim cmi2 As MethodInfo = GetType(C).GetMethod("M2")
        ' Shared method with one argument of type C.
        Dim cmi3 As MethodInfo = GetType(C).GetMethod("M3")
        ' Shared method with two arguments of type C.
        Dim cmi4 As MethodInfo = GetType(C).GetMethod("M4")
        
        ' Instance method with one argument of type C.
        Dim fmi1 As MethodInfo = GetType(F).GetMethod("M1")
        ' Shared method with one argument of type C.
        Dim fmi3 As MethodInfo = GetType(F).GetMethod("M3")
        ' Shared method with an argument of type F and an 
        ' argument of type C.
        Dim fmi4 As MethodInfo = GetType(F).GetMethod("M4")
        
        Console.WriteLine(vbLf & "An instance method on any type, with an argument of type C.")
        ' D can represent any instance method that exactly matches its
        ' signature. Methods on C and F are shown here.
        '
        d = CType([Delegate].CreateDelegate(GetType(D), c1, cmi1), D)
        d(c2)
        d = CType([Delegate].CreateDelegate(GetType(D), f1, fmi1), D)
        d(c2)
        
        Console.WriteLine(vbLf & "An instance method on C with no arguments.")
        ' D can represent an instance method on C that has no arguments;
        ' in this case, the argument of D represents the hidden first
        ' argument of any instance method. The delegate acts like a 
        ' Shared method, and an instance of C must be passed each time
        ' it is invoked.
        '
        d = CType([Delegate].CreateDelegate(GetType(D), Nothing, cmi2), D)
        d(c1)
        
        Console.WriteLine(vbLf & "A Shared method on any type, with an argument of type C.")
        ' D can represent any Shared method with the same signature.
        ' Methods on F and C are shown here.
        '
        d = CType([Delegate].CreateDelegate(GetType(D), Nothing, cmi3), D)
        d(c1)
        d = CType([Delegate].CreateDelegate(GetType(D), Nothing, fmi3), D)
        d(c1)
        
        Console.WriteLine(vbLf & "A Shared method on any type, with an argument of")
        Console.WriteLine("    that type and an argument of type C.")
        ' D can represent any Shared method with one argument of the
        ' type the method belongs and a second argument of type C.
        ' In this case, the method is closed over the instance of
        ' supplied for the its first argument, and acts like an instance
        ' method. Methods on F and C are shown here.
        '
        d = CType([Delegate].CreateDelegate(GetType(D), c1, cmi4), D)
        d(c2)
        Dim test As [Delegate] = _
            [Delegate].CreateDelegate(GetType(D), f1, fmi4, false)

        ' This final example specifies False for throwOnBindFailure 
        ' in the call to CreateDelegate, so the variable 'test'
        ' contains Nothing if the method fails to bind (for 
        ' example, if fmi4 happened to represent a method of  
        ' some class other than F).
        '
        If test IsNot Nothing Then
            d = CType(test, D)
            d(c2)
        End If
    
    End Sub
End Class

' This code example produces the following output:
'
'An instance method on any type, with an argument of type C.
'Instance method M1(c As C) on C:  this.id = 42, c.ID = 1491
'Instance method M1(c As C) on F:  c.ID = 1491
'
'An instance method on C with no arguments.
'Instance method M2() on C:  this.id = 42
'
'A Shared method on any type, with an argument of type C.
'Shared method M3(c As C) on C:  c.ID = 42
'Shared method M3(c As C) on F:  c.ID = 42
'
'A Shared method on any type, with an argument of
'    that type and an argument of type C.
'Shared method M4(c1 As C, c2 As C) on C:  c1.ID = 42, c2.ID = 1491
'Shared method M4(f As F, c As C) on F:  c.ID = 1491
'

Комментарии

Этот перегруженный метод и CreateDelegate(Type, Object, MethodInfo) перегрузка метода, которая всегда вызывает сбой при привязке, предоставляют наиболее гибкий способ создания делегатов.This method overload and the CreateDelegate(Type, Object, MethodInfo) method overload, which always throws on failure to bind, provide the most flexible way to create delegates. Их можно использовать для создания делегатов для статических методов или и без первого аргумента.You can use them to create delegates for either static or instance methods, with or without a first argument.

Примечание

Если не указать первый аргумент, используйте CreateDelegate(Type, MethodInfo, Boolean) перегрузку метода для повышения производительности.If you do not supply a first argument, use the CreateDelegate(Type, MethodInfo, Boolean) method overload for better performance.

Тип делегата и метод должны иметь совместимые типы возвращаемых значения.The delegate type and the method must have compatible return types. То есть тип method возвращаемого значения должен быть назначен возвращаемому typeтипу.That is, the return type of method must be assignable to the return type of type.

Если firstArgument указан аргумент, он method передается при каждом вызове делегата; firstArgument считается привязанным к делегату, и делегат называется закрытым для своего первого аргумента.If firstArgument is supplied, it is passed to method every time the delegate is invoked; firstArgument is said to be bound to the delegate, and the delegate is said to be closed over its first argument. Если method имеет static значение(Shared в Visual Basic), список аргументов, предоставленный при вызове делегата, включает все параметры, кроме method первого; если является методом экземпляра firstArgument , то передается в скрытый экземпляр. параметр (представленный this в C#или Me в Visual Basic).If method is static (Shared in Visual Basic), the argument list supplied when invoking the delegate includes all parameters except the first; if method is an instance method, then firstArgument is passed to the hidden instance parameter (represented by this in C#, or by Me in Visual Basic).

Если firstArgument указан аргумент, первый method параметр должен быть ссылочным типом и firstArgument должен быть совместим с этим типом.If firstArgument is supplied, the first parameter of method must be a reference type, and firstArgument must be compatible with that type.

Важно!

Если method имеет firstArgument ValueType Object значение (Shared в Visual Basic) и его первый параметр имеет тип или, то может быть типом значения. staticIf method is static (Shared in Visual Basic) and its first parameter is of type Object or ValueType, then firstArgument can be a value type. В этом случае firstArgument автоматически упаковывается.In this case firstArgument is automatically boxed. Автоматическая упаковка- C# преобразование не выполняется для других аргументов, как в вызове функции или Visual Basic.Automatic boxing does not occur for any other arguments, as it would in a C# or Visual Basic function call.

Если firstArgument является пустой ссылкой и method является методом экземпляра, результат зависит от сигнатур типа type делегата и method:If firstArgument is a null reference and method is an instance method, the result depends on the signatures of the delegate type type and of method:

  • Если сигнатура type явно включает в себя скрытый первый methodпараметр, то говорят, что делегат представляет открытый метод экземпляра.If the signature of type explicitly includes the hidden first parameter of method, the delegate is said to represent an open instance method. При вызове делегата первый аргумент в списке аргументов передается в параметр methodскрытого экземпляра.When the delegate is invoked, the first argument in the argument list is passed to the hidden instance parameter of method.

  • Если сигнатуры method и type совпадают (то есть все типы параметров совместимы), делегат считается закрытым по пустой ссылке.If the signatures of method and type match (that is, all parameter types are compatible), then the delegate is said to be closed over a null reference. Вызов делегата аналогичен вызову метода экземпляра для экземпляра со значением NULL, что не особенно полезно для этого.Invoking the delegate is like calling an instance method on a null instance, which is not a particularly useful thing to do.

Если firstArgument параметр является пустой ссылкой и method является статическим, результат зависит от сигнатур типа type делегата и method:If firstArgument is a null reference and method is static, the result depends on the signatures of the delegate type type and of method:

  • Если сигнатура method и type совпадает (то есть все типы параметров совместимы), делегат называется открытым статическим методом.If the signature of method and type match (that is, all parameter types are compatible), the delegate is said to represent an open static method. Это наиболее распространенный случай для статических методов.This is the most common case for static methods. В этом случае можно получить немного более высокую производительность с помощью CreateDelegate(Type, MethodInfo, Boolean) перегрузки метода.In this case, you can get slightly better performance by using the CreateDelegate(Type, MethodInfo, Boolean) method overload.

  • Если сигнатура type начинается со второго method параметра, а остальные типы параметров совместимы, то делегат называется закрытым с помощью пустой ссылки.If the signature of type begins with the second parameter of method and the rest of the parameter types are compatible, then the delegate is said to be closed over a null reference. При вызове делегата в первый параметр метода methodпередается пустая ссылка.When the delegate is invoked, a null reference is passed to the first parameter of method.

Примечание

Начиная с .NET Framework 2.0 с пакетом обновления 1 (SP1).NET Framework 2.0 Service Pack 1, этот метод можно использовать для доступа к закрытым методам, если вызывающему объекту был предоставлен ReflectionPermission ReflectionPermissionFlag.RestrictedMemberAccess флаг, и если набор разрешений неоткрытых методов ограничен набором предоставления вызывающего объекта или подмножеством сочетани.Starting with the .NET Framework 2.0 с пакетом обновления 1 (SP1).NET Framework 2.0 Service Pack 1, this method can be used to access non-public methods if the caller has been granted ReflectionPermission with the ReflectionPermissionFlag.RestrictedMemberAccess flag and if the grant set of the non-public methods is restricted to the caller's grant set, or a subset thereof. (См. раздел вопросы безопасности для отражения.)(See Security Considerations for Reflection.)

Для применения этих функциональных возможностей приложение должно использовать .NET Framework 3,5.NET Framework 3.5 или более поздние версии.To use this functionality, your application should target the .NET Framework 3,5.NET Framework 3.5 or later.

Совместимые типы параметров и возвращаемый типCompatible Parameter Types and Return Type

Типы параметров и возвращаемый тип делегата должны быть совместимы с типами параметров и типом возвращаемого значения метода, который представляет делегат. типы не обязательно должны точно совпадать.The parameter types and return type of a delegate must be compatible with the parameter types and return type of the method the delegate represents; the types do not have to match exactly.

Примечание

В .NET Framework версии 1,0 и 1,1 типы должны точно совпадать.In the .NET Framework version 1.0 and 1.1 the types must match exactly.

Если тип параметра делегата является более строгим, чем тип параметра метода, то параметр делегата совместим с соответствующим параметром метода, так как это гарантирует, что аргумент, переданный делегату, может быть безопасно передан методу.A parameter of a delegate is compatible with the corresponding parameter of a method if the type of the delegate parameter is more restrictive than the type of the method parameter, because this guarantees that an argument passed to the delegate can be passed safely to the method.

Аналогичным образом, тип возвращаемого значения делегата совместим с типом возвращаемого значения метода, если тип возвращаемого значения метода является более строгим, чем тип возвращаемого значения делегата, так как это гарантирует, что возвращаемое значение метода может быть безопасно приведено к типу возвращаемого значения делегата.Similarly, the return type of a delegate is compatible with the return type of a method if the return type of the method is more restrictive than the return type of the delegate, because this guarantees that the return value of the method can be cast safely to the return type of the delegate.

Например, делегат Hashtable с параметром типа и Object типом возвращаемого значения может представлять метод с параметром типа Object и возвращаемым значением типа Hashtable.For example, a delegate with a parameter of type Hashtable and a return type of Object can represent a method with a parameter of type Object and a return value of type Hashtable.

Определение методов, которые может представлять делегатDetermining the Methods a Delegate Can Represent

Еще один полезный способ представить гибкость, обеспечиваемую этой перегрузкой CreateDelegate , заключается в том, что любой заданный делегат может представлять четыре различных сочетания сигнатуры и типа метода (статический и экземпляр).Another useful way to think of the flexibility provided by this overload of CreateDelegate is that any given delegate can represent four different combinations of method signature and method kind (static versus instance). Рассмотрим тип D делегата с одним аргументом типа C.Consider a delegate type D with one argument of type C. Ниже описаны методы D , которые могут представлять, игнорируя возвращаемый тип, так как он должен совпадать во всех случаях:The following describes the methods D can represent, ignoring the return type since it must match in all cases:

  • Dможет представлять любой метод экземпляра, имеющий только один аргумент типа C, независимо от того, к какому типу относится метод экземпляра.D can represent any instance method that has exactly one argument of type C, regardless of what type the instance method belongs to. При CreateDelegate method вызове метод является экземпляром типа, а получившийся делегат называется закрытым для этого экземпляра. firstArgumentWhen CreateDelegate is called, firstArgument is an instance of the type method belongs to, and the resulting delegate is said to be closed over that instance. (Тривиальный элемент D также может быть закрыт над пустой ссылкой, если firstArgument имеет nullзначение.)(Trivially, D can also be closed over a null reference if firstArgument is null.)

  • Dможет представлять метод C экземпляра, не имеющий аргументов.D can represent an instance method of C that has no arguments. CreateDelegate ПриfirstArgument вызове метода является пустой ссылкой.When CreateDelegate is called, firstArgument is a null reference. Результирующий делегат представляет открытый метод экземпляра, а экземпляр C должен предоставляться каждый раз при вызове метода.The resulting delegate represents an open instance method, and an instance of C must be supplied each time it is invoked.

  • Dможет представлять статический метод, который принимает один аргумент типа C, и этот метод может принадлежать любому типу.D can represent a static method that takes one argument of type C, and that method can belong to any type. CreateDelegate ПриfirstArgument вызове метода является пустой ссылкой.When CreateDelegate is called, firstArgument is a null reference. Результирующий делегат представляет открытый статический метод, а экземпляр C должен предоставляться каждый раз при вызове метода.The resulting delegate represents an open static method, and an instance of C must be supplied each time it is invoked.

  • Dможет представлять статический метод, принадлежащий типу F и имеющий два аргумента типа F и типа C.D can represent a static method that belongs to type F and has two arguments, of type F and type C. При CreateDelegate Fвызове метод является экземпляром. firstArgumentWhen CreateDelegate is called, firstArgument is an instance of F. Результирующий делегат представляет статический метод, закрытый для этого экземпляра F.The resulting delegate represents a static method that is closed over that instance of F. Обратите внимание, что в F случае C , когда и относятся к одному и тому же типу, статический метод имеет два аргумента этого типа.Note that in the case where F and C are the same type, the static method has two arguments of that type. (В данном случае закрывается с пустой ссылкой, D если firstArgument имеет nullзначение.)(In this case, D is closed over a null reference if firstArgument is null.)

Безопасность

ReflectionPermission
При вызове поздней привязки с помощью таких механизмов InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]), как.when invoked late-bound through mechanisms such as InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]). Связанное перечисление: MemberAccess.Associated enumeration: MemberAccess.

Дополнительно

CreateDelegate(Type, Object, String, Boolean, Boolean)

Создает делегат указанного типа, представляющий заданный статический метод, вызываемый для заданного экземпляра класса с заданной установкой учета регистра и заданным поведением на случай, если операция связывания завершится неудачей.Creates a delegate of the specified type that represents the specified instance method to invoke on the specified class instance, with the specified case-sensitivity and the specified behavior on failure to bind.

public:
 static Delegate ^ CreateDelegate(Type ^ type, System::Object ^ target, System::String ^ method, bool ignoreCase, bool throwOnBindFailure);
public static Delegate CreateDelegate (Type type, object target, string method, bool ignoreCase, bool throwOnBindFailure);
static member CreateDelegate : Type * obj * string * bool * bool -> Delegate

Параметры

type
Type

Тип Type создаваемого делегата.The Type of delegate to create.

target
Object

Экземпляр класса, для которого вызывается метод method.The class instance on which method is invoked.

method
String

Имя метода экземпляра, который должен быть представлен делегатом.The name of the instance method that the delegate is to represent.

ignoreCase
Boolean

Логическое значение, указывающее, следует ли учитывать регистр при сравнении имени метода.A Boolean indicating whether to ignore the case when comparing the name of the method.

throwOnBindFailure
Boolean

Значение true для создания исключения, если метод method невозможно привязать; в противном случае — значение false.true to throw an exception if method cannot be bound; otherwise, false.

Возвраты

Создает делегат указанного типа, представляющий заданный метод экземпляра, который вызывается для заданного экземпляра класса.A delegate of the specified type that represents the specified instance method to invoke on the specified class instance.

Исключения

typenull.type is null.

- или --or- Свойство target имеет значение null.target is null.

- или --or- methodnull.method is null.

type не является производным от MulticastDelegate.type does not inherit MulticastDelegate.

- или --or- type не является объектом типа RuntimeType.type is not a RuntimeType. См. статью Типы среды выполнения в отражении.See Runtime Types in Reflection.

- или --or- method не является методом экземпляра.method is not an instance method.

-или--or- Параметр method невозможно привязать, например, потому, что его невозможно найти, а throwOnBindFailure имеет значение true.method cannot be bound, for example because it cannot be found, and throwOnBindFailure is true.

Метод Invoke для type не найден.The Invoke method of type is not found.

Вызывающий объект не имеет необходимых разрешений для доступа к method.The caller does not have the permissions necessary to access method.

Комментарии

Этот метод создает делегаты только для методов экземпляра.This method creates delegates for instance methods only. Метод экземпляра — это метод, связанный с экземпляром класса; статический метод — это метод, который связан с самим классом.An instance method is a method that is associated with an instance of a class; a static method is a method that is associated with the class itself.

Примечание

Начиная с .NET Framework 2.0 с пакетом обновления 1 (SP1).NET Framework 2.0 Service Pack 1, этот метод можно использовать для доступа к закрытым методам, если вызывающему объекту был предоставлен ReflectionPermission ReflectionPermissionFlag.RestrictedMemberAccess флаг, и если набор разрешений неоткрытых методов ограничен набором предоставления вызывающего объекта или подмножеством сочетани.Starting with the .NET Framework 2.0 с пакетом обновления 1 (SP1).NET Framework 2.0 Service Pack 1, this method can be used to access non-public methods if the caller has been granted ReflectionPermission with the ReflectionPermissionFlag.RestrictedMemberAccess flag and if the grant set of the non-public methods is restricted to the caller's grant set, or a subset thereof. (См. раздел вопросы безопасности для отражения.)(See Security Considerations for Reflection.)

Для применения этих функциональных возможностей приложение должно использовать .NET Framework 3,5.NET Framework 3.5 или более поздние версии.To use this functionality, your application should target the .NET Framework 3,5.NET Framework 3.5 or later.

Безопасность

ReflectionPermission
При вызове поздней привязки с помощью таких механизмов InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]), как.when invoked late-bound through mechanisms such as InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]). Связанное перечисление: MemberAccess.Associated enumeration: MemberAccess.

Дополнительно

CreateDelegate(Type, MethodInfo, Boolean)

Создает делегат указанного типа, представляющий заданный статический метод, с заданным поведением на случай, если операция связывания завершится неудачей.Creates a delegate of the specified type to represent the specified static method, with the specified behavior on failure to bind.

public:
 static Delegate ^ CreateDelegate(Type ^ type, System::Reflection::MethodInfo ^ method, bool throwOnBindFailure);
public static Delegate CreateDelegate (Type type, System.Reflection.MethodInfo method, bool throwOnBindFailure);
static member CreateDelegate : Type * System.Reflection.MethodInfo * bool -> Delegate

Параметры

type
Type

Тип Type создаваемого делегата.The Type of delegate to create.

method
MethodInfo

Объект MethodInfo, описывающий статический метод или метод экземпляра, который будет представлен делегатом.The MethodInfo describing the static or instance method the delegate is to represent.

throwOnBindFailure
Boolean

Значение true для создания исключения, если метод method привязать невозможно; в противном случае — значение false.true to throw an exception if method cannot be bound; otherwise, false.

Возвраты

Делегат указанного типа, представляющий заданный статический метод.A delegate of the specified type to represent the specified static method.

Исключения

Свойство type имеет значение null.type is null.

-или--or- Свойство method имеет значение null.method is null.

type не является производным от MulticastDelegate.type does not inherit MulticastDelegate.

- или --or- type не является объектом типа RuntimeType.type is not a RuntimeType. См. статью Типы среды выполнения в отражении.See Runtime Types in Reflection.

-или--or- method невозможно привязать, и throwOnBindFailure имеет значение true.method cannot be bound, and throwOnBindFailure is true.

-или--or- method не является объектом типа RuntimeMethodInfo.method is not a RuntimeMethodInfo. См. статью Типы среды выполнения в отражении.See Runtime Types in Reflection.

Метод Invoke типа type не найден.The Invoke method of type is not found.

Вызывающий объект не имеет необходимых разрешений для доступа к method.The caller does not have the permissions necessary to access method.

Примеры

Этот раздел содержит два примера кода.This section contains two code examples. В первом примере показаны два вида делегатов, которые можно создать с помощью этой перегрузки метода: открыть через метод экземпляра и открыть в статическом методе.The first example demonstrates the two kinds of delegates that can be created with this method overload: open over an instance method and open over a static method.

Во втором примере кода демонстрируются совместимые типы параметров и возвращаемые типы.The second code example demonstrates compatible parameter types and return types.

Пример 1Example 1

В следующем примере кода показаны два способа создания делегата с помощью этой перегрузки CreateDelegate метода.The following code example demonstrates the two ways a delegate can be created using this overload of the CreateDelegate method.

Примечание

Существует две перегрузки CreateDelegate метода, указывающие, MethodInfo но не первый аргумент; их функциональные возможности одинаковы, за исключением того, что можно указать, следует ли создавать привязку при сбое, а другое всегда создает исключение.There are two overloads of the CreateDelegate method that specify a MethodInfo but not a first argument; their functionality is the same except that one allows you to specify whether to throw on failure to bind, and the other always throws. В этом примере кода используются обе перегрузки.This code example uses both overloads.

В примере объявляется C класс со статическим методом M2 и методом M1экземпляра, а также C два типа делегата: D1 принимает экземпляр и строку и D2 принимает строку.The example declares a class C with a static method M2 and an instance method M1, and two delegate types: D1 takes an instance of C and a string, and D2 takes a string.

Второй класс с именем Example содержит код, создающий делегаты.A second class named Example contains the code that creates the delegates.

  • Делегат типа D1, представляющий открытый метод экземпляра, создается для метода M1экземпляра.A delegate of type D1, representing an open instance method, is created for the instance method M1. Экземпляр должен передаваться при вызове делегата.An instance must be passed when the delegate is invoked.

  • Для статического метода M2создается D2делегат типа, представляющий открытый статический метод.A delegate of type D2, representing an open static method, is created for the static method M2.

using System;
using System.Reflection;
using System.Security.Permissions;

// Declare three delegate types for demonstrating the combinations
// of static versus instance methods and open versus closed
// delegates.
//
public delegate void D1(C c, string s);
public delegate void D2(string s);
public delegate void D3();

// A sample class with an instance method and a static method.
//
public class C
{
    private int id;
    public C(int id) { this.id = id; }

    public void M1(string s) 
    { 
        Console.WriteLine("Instance method M1 on C:  id = {0}, s = {1}",
            this.id, s);
    }
  
    public static void M2(string s)
    { 
        Console.WriteLine("Static method M2 on C:  s = {0}", s); 
    }
}

public class Example
{
    public static void Main()
    {
        C c1 = new C(42);

        // Get a MethodInfo for each method.
        //
        MethodInfo mi1 = typeof(C).GetMethod("M1", 
            BindingFlags.Public | BindingFlags.Instance);
        MethodInfo mi2 = typeof(C).GetMethod("M2",
            BindingFlags.Public | BindingFlags.Static);

        D1 d1;
        D2 d2;
        D3 d3;


        Console.WriteLine("\nAn instance method closed over C.");
        // In this case, the delegate and the
        // method must have the same list of argument types; use
        // delegate type D2 with instance method M1.
        //
        Delegate test = 
            Delegate.CreateDelegate(typeof(D2), c1, mi1, false);

        // Because false was specified for throwOnBindFailure 
        // in the call to CreateDelegate, the variable 'test'
        // contains null if the method fails to bind (for 
        // example, if mi1 happened to represent a method of  
        // some class other than C).
        //
        if (test != null)
        {
            d2 = (D2) test;

            // The same instance of C is used every time the 
            // delegate is invoked.
            d2("Hello, World!");
            d2("Hi, Mom!");
        }


        Console.WriteLine("\nAn open instance method.");
        // In this case, the delegate has one more 
        // argument than the instance method; this argument comes
        // at the beginning, and represents the hidden instance
        // argument of the instance method. Use delegate type D1
        // with instance method M1.
        //
        d1 = (D1) Delegate.CreateDelegate(typeof(D1), null, mi1);

        // An instance of C must be passed in each time the 
        // delegate is invoked.
        //
        d1(c1, "Hello, World!");
        d1(new C(5280), "Hi, Mom!");


        Console.WriteLine("\nAn open static method.");
        // In this case, the delegate and the method must 
        // have the same list of argument types; use delegate type
        // D2 with static method M2.
        //
        d2 = (D2) Delegate.CreateDelegate(typeof(D2), null, mi2);

        // No instances of C are involved, because this is a static
        // method. 
        //
        d2("Hello, World!");
        d2("Hi, Mom!");


        Console.WriteLine("\nA static method closed over the first argument (String).");
        // The delegate must omit the first argument of the method.
        // A string is passed as the firstArgument parameter, and 
        // the delegate is bound to this string. Use delegate type 
        // D3 with static method M2. 
        //
        d3 = (D3) Delegate.CreateDelegate(typeof(D3), 
            "Hello, World!", mi2);

        // Each time the delegate is invoked, the same string is
        // used.
        d3();
    }
}

/* This code example produces the following output:

An instance method closed over C.
Instance method M1 on C:  id = 42, s = Hello, World!
Instance method M1 on C:  id = 42, s = Hi, Mom!

An open instance method.
Instance method M1 on C:  id = 42, s = Hello, World!
Instance method M1 on C:  id = 5280, s = Hi, Mom!

An open static method.
Static method M2 on C:  s = Hello, World!
Static method M2 on C:  s = Hi, Mom!

A static method closed over the first argument (String).
Static method M2 on C:  s = Hello, World!
 */
Imports System.Reflection
Imports System.Security.Permissions

' Declare three delegate types for demonstrating the combinations
' of Shared versus instance methods and open versus closed
' delegates.
'
Public Delegate Sub D1(ByVal c As C, ByVal s As String) 
Public Delegate Sub D2(ByVal s As String) 
Public Delegate Sub D3() 

' A sample class with an instance method and a Shared method.
'
Public Class C
    Private id As Integer
    Public Sub New(ByVal id As Integer) 
        Me.id = id
    End Sub

    Public Sub M1(ByVal s As String) 
        Console.WriteLine("Instance method M1 on C:  id = {0}, s = {1}", _
            Me.id, s)
    End Sub
    
    Public Shared Sub M2(ByVal s As String) 
        Console.WriteLine("Shared method M2 on C:  s = {0}", s)
    End Sub
End Class

Public Class Example
    
    Public Shared Sub Main() 

        Dim c1 As New C(42)
        
        ' Get a MethodInfo for each method.
        '
        Dim mi1 As MethodInfo = GetType(C).GetMethod("M1", _
            BindingFlags.Public Or BindingFlags.Instance)
        Dim mi2 As MethodInfo = GetType(C).GetMethod("M2", _
            BindingFlags.Public Or BindingFlags.Static)
        
        Dim d1 As D1
        Dim d2 As D2
        Dim d3 As D3
        
        
        Console.WriteLine(vbLf & "An instance method closed over C.")
        ' In this case, the delegate and the
        ' method must have the same list of argument types; use
        ' delegate type D2 with instance method M1.
        '
        Dim test As [Delegate] = _
            [Delegate].CreateDelegate(GetType(D2), c1, mi1, False)

        ' Because False was specified for throwOnBindFailure 
        ' in the call to CreateDelegate, the variable 'test'
        ' contains Nothing if the method fails to bind (for 
        ' example, if mi1 happened to represent a method of 
        ' some class other than C).
        '
        If test IsNot Nothing Then
            d2 = CType(test, D2)

            ' The same instance of C is used every time the
            ' delegate is invoked.
            d2("Hello, World!")
            d2("Hi, Mom!")
        End If
        
        
        Console.WriteLine(vbLf & "An open instance method.")
        ' In this case, the delegate has one more 
        ' argument than the instance method; this argument comes
        ' at the beginning, and represents the hidden instance
        ' argument of the instance method. Use delegate type D1
        ' with instance method M1.
        '
        d1 = CType([Delegate].CreateDelegate(GetType(D1), Nothing, mi1), D1)
        
        ' An instance of C must be passed in each time the 
        ' delegate is invoked.
        '
        d1(c1, "Hello, World!")
        d1(New C(5280), "Hi, Mom!")
        
        
        Console.WriteLine(vbLf & "An open Shared method.")
        ' In this case, the delegate and the method must 
        ' have the same list of argument types; use delegate type
        ' D2 with Shared method M2.
        '
        d2 = CType([Delegate].CreateDelegate(GetType(D2), Nothing, mi2), D2)
        
        ' No instances of C are involved, because this is a Shared
        ' method. 
        '
        d2("Hello, World!")
        d2("Hi, Mom!")
        
        
        Console.WriteLine(vbLf & "A Shared method closed over the first argument (String).")
        ' The delegate must omit the first argument of the method.
        ' A string is passed as the firstArgument parameter, and 
        ' the delegate is bound to this string. Use delegate type 
        ' D3 with Shared method M2. 
        '
        d3 = CType([Delegate].CreateDelegate(GetType(D3), "Hello, World!", mi2), D3)
        
        ' Each time the delegate is invoked, the same string is
        ' used.
        d3()
    
    End Sub
End Class

' This code example produces the following output:
'
'An instance method closed over C.
'Instance method M1 on C:  id = 42, s = Hello, World!
'Instance method M1 on C:  id = 42, s = Hi, Mom!
'
'An open instance method.
'Instance method M1 on C:  id = 42, s = Hello, World!
'Instance method M1 on C:  id = 5280, s = Hi, Mom!
'
'An open Shared method.
'Shared method M2 on C:  s = Hello, World!
'Shared method M2 on C:  s = Hi, Mom!
'
'A Shared method closed over the first argument (String).
'Shared method M2 on C:  s = Hello, World!
' 

Пример 2Example 2

В следующем примере кода демонстрируется совместимость типов параметров и возвращаемых типов.The following code example demonstrates compatibility of parameter types and return types.

Примечание

В CreateDelegate(Type, MethodInfo) этом примере кода используется перегрузка метода.This code example uses the CreateDelegate(Type, MethodInfo) method overload. Использование других перегрузок, которые принимаются MethodInfo , аналогично.The use of other overloads that take MethodInfo is similar.

В примере кода определяется базовый класс с именем Base и Derived класс, производный от Base.The code example defines a base class named Base and a class named Derived that derives from Base. Производный static класс имеет метод (Shared в Visual Basic) с именем MyMethod с одним параметром типа Base и типом возвращаемого значения Derived.The derived class has a static (Shared in Visual Basic) method named MyMethod with one parameter of type Base and a return type of Derived. В примере кода также определяется делегат с именем Example с одним параметром типа Derived и типом возвращаемого значения Base.The code example also defines a delegate named Example that has one parameter of type Derived and a return type of Base.

В примере кода показано, что для представления Example метода MyMethodможно использовать делегат с именем.The code example demonstrates that the delegate named Example can be used to represent the method MyMethod. Метод можно привязать к делегату по следующим причинам:The method can be bound to the delegate because:

  • ТипDerivedпараметра делегата () более ограничен, чем MyMethod тип параметра (Base), чтобы всегда быть уверенным MyMethodв передаче аргумента делегата.The parameter type of the delegate (Derived) is more restrictive than the parameter type of MyMethod (Base), so that it is always safe to pass the argument of the delegate to MyMethod.

  • Тип возвращаемого значения MyMethod (Derived) является более строгой, чем тип параметра делегата (Base), чтобы всегда быть уверенным в том, чтобы привести возвращаемый тип метода к возвращаемому типу делегата.The return type of MyMethod (Derived) is more restrictive than the parameter type of the delegate (Base), so that it is always safe to cast the return type of the method to the return type of the delegate.

В примере кода выходные данные не создаются.The code example produces no output.

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());
}
using System;
using System.Reflection;

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

public 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 new Derived();
    }
}

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

class Test
{
    public static void Main()
    {
        // The binding flags needed to retrieve MyMethod.
        BindingFlags flags = BindingFlags.Public | BindingFlags.Static;

        // Get a MethodInfo that represents MyMethod.
        MethodInfo minfo = typeof(Derived).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(typeof(Example), minfo);

        // Execute MyMethod using the delegate Example.
        //        
        Base b = ex(new Derived());
    }
}
Imports System.Reflection

' Define two classes to use in the demonstration, a base class and 
' a class that derives from it.
'
Public Class Base
End Class

Public Class Derived
    Inherits Base

    ' Define a Shared 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 Shared Function MyMethod(ByVal arg As Base) As Derived
        Dim dummy As Base = arg
        Return New Derived()
    End Function

End Class

' Define a delegate that takes an instance of Derived and returns an
' instance of Base.
'
Public Delegate Function Example(ByVal arg As Derived) As Base

Module Test

    Sub Main()

        ' The binding flags needed to retrieve MyMethod.
        Dim flags As BindingFlags = _
            BindingFlags.Public Or BindingFlags.Static

        ' Get a MethodInfo that represents MyMethod.
        Dim minfo As MethodInfo = _
            GetType(Derived).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). 
        '
        Dim ex As Example = CType( _
            [Delegate].CreateDelegate(GetType(Example), minfo), _
            Example _
        )

        ' Execute MyMethod using the delegate Example.
        '        
        Dim b As Base = ex(New Derived())
    End Sub
End Module

Комментарии

Эта перегрузка метода может создавать делегаты открытых статических методов и делегаты методов открытого экземпляра, т. е. Делегаты, которые предоставляют скрытый первый аргумент методов экземпляра.This method overload can create open static method delegates and open instance method delegates - that is, delegates that expose the hidden first argument of instance methods. Подробное описание см. в разделе более общий CreateDelegate(Type, Object, MethodInfo, Boolean) перегруженный метод, который позволяет создавать все сочетания открытых или закрытых делегатов для экземпляров или статических методов.For a detailed explanation, see the more general CreateDelegate(Type, Object, MethodInfo, Boolean) method overload, which allows you to create all combinations of open or closed delegates for instance or static methods.

Примечание

Этот перегруженный метод следует использовать, когда делегат не закрыт по первому аргументу, так как в этом случае он выполняется несколько быстрее.This method overload should be used when the delegate is not closed over its first argument, because it is somewhat faster in that case.

Примечание

Начиная с .NET Framework 2.0 с пакетом обновления 1 (SP1).NET Framework 2.0 Service Pack 1, этот метод можно использовать для доступа к закрытым методам, если вызывающему объекту был предоставлен ReflectionPermission ReflectionPermissionFlag.RestrictedMemberAccess флаг, и если набор разрешений неоткрытых методов ограничен набором предоставления вызывающего объекта или подмножеством сочетани.Starting with the .NET Framework 2.0 с пакетом обновления 1 (SP1).NET Framework 2.0 Service Pack 1, this method can be used to access non-public methods if the caller has been granted ReflectionPermission with the ReflectionPermissionFlag.RestrictedMemberAccess flag and if the grant set of the non-public methods is restricted to the caller's grant set, or a subset thereof. (См. раздел вопросы безопасности для отражения.)(See Security Considerations for Reflection.)

Для применения этих функциональных возможностей приложение должно использовать .NET Framework 3,5.NET Framework 3.5 или более поздние версии.To use this functionality, your application should target the .NET Framework 3,5.NET Framework 3.5 or later.

Совместимые типы параметров и возвращаемый типCompatible Parameter Types and Return Type

Типы параметров и возвращаемый тип делегата должны быть совместимы с типами параметров и типом возвращаемого значения метода, который представляет делегат. типы не обязательно должны точно совпадать.The parameter types and return type of a delegate must be compatible with the parameter types and return type of the method the delegate represents; the types do not have to match exactly.

Примечание

В .NET Framework версии 1,0 и 1,1 типы должны точно совпадать.In the .NET Framework version 1.0 and 1.1, the types must match exactly.

Если тип параметра делегата является более строгим, чем тип параметра метода, то параметр делегата совместим с соответствующим параметром метода, так как это гарантирует, что аргумент, переданный делегату, может быть безопасно передан методу.A parameter of a delegate is compatible with the corresponding parameter of a method if the type of the delegate parameter is more restrictive than the type of the method parameter, because this guarantees that an argument passed to the delegate can be passed safely to the method.

Аналогичным образом, тип возвращаемого значения делегата совместим с типом возвращаемого значения метода, если тип возвращаемого значения метода является более строгим, чем тип возвращаемого значения делегата, так как это гарантирует, что возвращаемое значение метода может быть безопасно приведено к типу возвращаемого значения делегата.Similarly, the return type of a delegate is compatible with the return type of a method if the return type of the method is more restrictive than the return type of the delegate, because this guarantees that the return value of the method can be cast safely to the return type of the delegate.

Например, делегат Hashtable с параметром типа и Object типом возвращаемого значения может представлять метод с параметром типа Object и возвращаемым значением типа Hashtable.For example, a delegate with a parameter of type Hashtable and a return type of Object can represent a method with a parameter of type Object and a return value of type Hashtable.

Безопасность

ReflectionPermission
При вызове поздней привязки с помощью таких механизмов InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]), как.when invoked late-bound through mechanisms such as InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]). Связанное перечисление: MemberAccess.Associated enumeration: MemberAccess.

Дополнительно

CreateDelegate(Type, Object, String)

Создает делегат указанного типа, представляющий заданный метод экземпляра, который вызывается для заданного экземпляра класса.Creates a delegate of the specified type that represents the specified instance method to invoke on the specified class instance.

public:
 static Delegate ^ CreateDelegate(Type ^ type, System::Object ^ target, System::String ^ method);
public static Delegate CreateDelegate (Type type, object target, string method);
static member CreateDelegate : Type * obj * string -> Delegate

Параметры

type
Type

Тип Type создаваемого делегата.The Type of delegate to create.

target
Object

Экземпляр класса, для которого вызывается метод method.The class instance on which method is invoked.

method
String

Имя метода экземпляра, который должен быть представлен делегатом.The name of the instance method that the delegate is to represent.

Возвраты

Создает делегат указанного типа, представляющий заданный метод экземпляра, который вызывается для заданного экземпляра класса.A delegate of the specified type that represents the specified instance method to invoke on the specified class instance.

Исключения

typenull.type is null.

- или --or- targetnull.target is null.

- или --or- methodnull.method is null.

type не является производным от MulticastDelegate.type does not inherit MulticastDelegate.

- или --or- type не является объектом типа RuntimeType.type is not a RuntimeType. См. статью Типы среды выполнения в отражении.See Runtime Types in Reflection.

- или --or- method не является методом экземпляра.method is not an instance method.

-или--or- Параметр method невозможно привязать, например, потому, что его не удалось найти.method cannot be bound, for example because it cannot be found.

Метод Invoke для type не найден.The Invoke method of type is not found.

Вызывающий объект не имеет необходимых разрешений для доступа к method.The caller does not have the permissions necessary to access method.

Комментарии

Этот метод создает делегаты только для методов экземпляра.This method creates delegates for instance methods only. Метод экземпляра — это метод, связанный с экземпляром класса; статический метод — это метод, который связан с самим классом.An instance method is a method that is associated with an instance of a class; a static method is a method that is associated with the class itself.

Перегрузка этого CreateDelegate(Type, Object, String, Boolean, Boolean) метода эквивалентна вызову перегрузки метода, указывающей true false для throwOnBindFailure ignoreCase и для.This method overload is equivalent to calling the CreateDelegate(Type, Object, String, Boolean, Boolean) method overload, specifying false for ignoreCase and true for throwOnBindFailure.

Примечание

Начиная с .NET Framework 2.0 с пакетом обновления 1 (SP1).NET Framework 2.0 Service Pack 1, этот метод можно использовать для доступа к закрытым методам, если вызывающему объекту был предоставлен ReflectionPermission ReflectionPermissionFlag.RestrictedMemberAccess флаг, и если набор разрешений неоткрытых методов ограничен набором предоставления вызывающего объекта или подмножеством сочетани.Starting with the .NET Framework 2.0 с пакетом обновления 1 (SP1).NET Framework 2.0 Service Pack 1, this method can be used to access non-public methods if the caller has been granted ReflectionPermission with the ReflectionPermissionFlag.RestrictedMemberAccess flag and if the grant set of the non-public methods is restricted to the caller's grant set, or a subset thereof. (См. раздел вопросы безопасности для отражения.)(See Security Considerations for Reflection.)

Для применения этих функциональных возможностей приложение должно использовать .NET Framework 3,5.NET Framework 3.5 или более поздние версии.To use this functionality, your application should target the .NET Framework 3,5.NET Framework 3.5 or later.

Безопасность

ReflectionPermission
При вызове поздней привязки с помощью таких механизмов InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]), как.when invoked late-bound through mechanisms such as InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]). Связанное перечисление: MemberAccess.Associated enumeration: MemberAccess.

Дополнительно

CreateDelegate(Type, Object, MethodInfo)

Создает делегат указанного типа, представляющий заданный статический метод или метод экземпляра, с заданным первым аргументом.Creates a delegate of the specified type that represents the specified static or instance method, with the specified first argument.

public:
 static Delegate ^ CreateDelegate(Type ^ type, System::Object ^ firstArgument, System::Reflection::MethodInfo ^ method);
public static Delegate CreateDelegate (Type type, object firstArgument, System.Reflection.MethodInfo method);
static member CreateDelegate : Type * obj * System.Reflection.MethodInfo -> Delegate

Параметры

type
Type

Тип Type создаваемого делегата.The Type of delegate to create.

firstArgument
Object

Объект, с которым связан делегат, или null для интерпретации method как static (Shared в Visual Basic).The object to which the delegate is bound, or null to treat method as static (Shared in Visual Basic).

method
MethodInfo

Объект MethodInfo, описывающий статический метод или метод экземпляра, который будет представлен делегатом.The MethodInfo describing the static or instance method the delegate is to represent.

Возвраты

Делегат указанного типа, представляющий заданный статический метод или метод экземпляра.A delegate of the specified type that represents the specified static or instance method.

Исключения

Свойство type имеет значение null.type is null.

-или--or- Свойство method имеет значение null.method is null.

type не является производным от MulticastDelegate.type does not inherit MulticastDelegate.

- или --or- type не является объектом типа RuntimeType.type is not a RuntimeType. См. статью Типы среды выполнения в отражении.See Runtime Types in Reflection.

- или --or- Не удалось выполнить связывание method.method cannot be bound.

-или--or- method не является объектом типа RuntimeMethodInfo.method is not a RuntimeMethodInfo. См. статью Типы среды выполнения в отражении.See Runtime Types in Reflection.

Метод Invoke типа type не найден.The Invoke method of type is not found.

Вызывающий объект не имеет необходимых разрешений для доступа к method.The caller does not have the permissions necessary to access method.

Примеры

Этот раздел содержит три примера кода.This section contains three code examples. В первом примере показаны четыре типа делегатов, которые могут быть созданы: закрыто над методом экземпляра, открыто через метод экземпляра, открыто через статический метод и закрыто по статическому методу.The first example demonstrates the four kinds of delegates that can be created: closed over an instance method, open over an instance method, open over a static method, and closed over a static method.

Во втором примере кода демонстрируются совместимые типы параметров и возвращаемые типы.The second code example demonstrates compatible parameter types and return types.

В третьем примере кода определяется один тип делегата и отображаются все методы, которые могут представляться типом делегата.The third code example defines a single delegate type, and shows all the methods that delegate type can represent.

Пример 1Example 1

В следующем примере кода показаны четыре способа создания делегата с помощью этой перегрузки CreateDelegate метода.The following code example demonstrates the four ways a delegate can be created using this overload of the CreateDelegate method.

Примечание

Существует две перегрузки CreateDelegate метода, которые задают firstArgument и MethodInfo; их функциональные возможности одинаковы, за исключением того, что позволяет указать, следует ли создавать привязку при ошибке, а вторая всегда создает исключение.There are two overloads of the CreateDelegate method that specify firstArgument and a MethodInfo; their functionality is the same except that one allows you to specify whether to throw on failure to bind, and the other always throws. В этом примере кода используются обе перегрузки.This code example uses both overloads.

В примере объявляется C класс со статическим методом M2 и методом M1экземпляра, а также C три типа делегата: D1 принимает экземпляр и строку, D2 принимает строку и D3не имеет аргументов.The example declares a class C with a static method M2 and an instance method M1, and three delegate types: D1 takes an instance of C and a string, D2 takes a string, and D3 has no arguments.

Второй класс с именем Example содержит код, создающий делегаты.A second class named Example contains the code that creates the delegates.

  • Делегат типа D2, закрытый над Cэкземпляром, создается для метода M1экземпляра.A delegate of type D2, closed over an instance of C, is created for the instance method M1. Он вызывается с разными строками, чтобы продемонстрировать, что привязанный экземпляр C всегда используется.It is invoked with different strings, to show that the bound instance of C is always used.

  • Делегат типа D1, представляющий открытый метод экземпляра, создается для метода M1экземпляра.A delegate of type D1, representing an open instance method, is created for the instance method M1. Экземпляр должен передаваться при вызове делегата.An instance must be passed when the delegate is invoked.

  • Для статического метода M2создается D2делегат типа, представляющий открытый статический метод.A delegate of type D2, representing an open static method, is created for the static method M2.

  • Наконец, для статического метода D3 M2создается делегат типа, закрытый над строкой.Finally, a delegate of type D3, closed over a string, is created for the static method M2. Метод вызывается, чтобы продемонстрировать, что он использует привязанную строку.The method is invoked to show that it uses the bound string.

using System;
using System.Reflection;
using System.Security.Permissions;

// Declare three delegate types for demonstrating the combinations
// of static versus instance methods and open versus closed
// delegates.
//
public delegate void D1(C c, string s);
public delegate void D2(string s);
public delegate void D3();

// A sample class with an instance method and a static method.
//
public class C
{
    private int id;
    public C(int id) { this.id = id; }

    public void M1(string s) 
    { 
        Console.WriteLine("Instance method M1 on C:  id = {0}, s = {1}",
            this.id, s);
    }
  
    public static void M2(string s)
    { 
        Console.WriteLine("Static method M2 on C:  s = {0}", s); 
    }
}

public class Example
{
    public static void Main()
    {
        C c1 = new C(42);

        // Get a MethodInfo for each method.
        //
        MethodInfo mi1 = typeof(C).GetMethod("M1", 
            BindingFlags.Public | BindingFlags.Instance);
        MethodInfo mi2 = typeof(C).GetMethod("M2",
            BindingFlags.Public | BindingFlags.Static);

        D1 d1;
        D2 d2;
        D3 d3;


        Console.WriteLine("\nAn instance method closed over C.");
        // In this case, the delegate and the
        // method must have the same list of argument types; use
        // delegate type D2 with instance method M1.
        //
        Delegate test = 
            Delegate.CreateDelegate(typeof(D2), c1, mi1, false);

        // Because false was specified for throwOnBindFailure 
        // in the call to CreateDelegate, the variable 'test'
        // contains null if the method fails to bind (for 
        // example, if mi1 happened to represent a method of  
        // some class other than C).
        //
        if (test != null)
        {
            d2 = (D2) test;

            // The same instance of C is used every time the 
            // delegate is invoked.
            d2("Hello, World!");
            d2("Hi, Mom!");
        }


        Console.WriteLine("\nAn open instance method.");
        // In this case, the delegate has one more 
        // argument than the instance method; this argument comes
        // at the beginning, and represents the hidden instance
        // argument of the instance method. Use delegate type D1
        // with instance method M1.
        //
        d1 = (D1) Delegate.CreateDelegate(typeof(D1), null, mi1);

        // An instance of C must be passed in each time the 
        // delegate is invoked.
        //
        d1(c1, "Hello, World!");
        d1(new C(5280), "Hi, Mom!");


        Console.WriteLine("\nAn open static method.");
        // In this case, the delegate and the method must 
        // have the same list of argument types; use delegate type
        // D2 with static method M2.
        //
        d2 = (D2) Delegate.CreateDelegate(typeof(D2), null, mi2);

        // No instances of C are involved, because this is a static
        // method. 
        //
        d2("Hello, World!");
        d2("Hi, Mom!");


        Console.WriteLine("\nA static method closed over the first argument (String).");
        // The delegate must omit the first argument of the method.
        // A string is passed as the firstArgument parameter, and 
        // the delegate is bound to this string. Use delegate type 
        // D3 with static method M2. 
        //
        d3 = (D3) Delegate.CreateDelegate(typeof(D3), 
            "Hello, World!", mi2);

        // Each time the delegate is invoked, the same string is
        // used.
        d3();
    }
}

/* This code example produces the following output:

An instance method closed over C.
Instance method M1 on C:  id = 42, s = Hello, World!
Instance method M1 on C:  id = 42, s = Hi, Mom!

An open instance method.
Instance method M1 on C:  id = 42, s = Hello, World!
Instance method M1 on C:  id = 5280, s = Hi, Mom!

An open static method.
Static method M2 on C:  s = Hello, World!
Static method M2 on C:  s = Hi, Mom!

A static method closed over the first argument (String).
Static method M2 on C:  s = Hello, World!
 */
Imports System.Reflection
Imports System.Security.Permissions

' Declare three delegate types for demonstrating the combinations
' of Shared versus instance methods and open versus closed
' delegates.
'
Public Delegate Sub D1(ByVal c As C, ByVal s As String) 
Public Delegate Sub D2(ByVal s As String) 
Public Delegate Sub D3() 

' A sample class with an instance method and a Shared method.
'
Public Class C
    Private id As Integer
    Public Sub New(ByVal id As Integer) 
        Me.id = id
    End Sub

    Public Sub M1(ByVal s As String) 
        Console.WriteLine("Instance method M1 on C:  id = {0}, s = {1}", _
            Me.id, s)
    End Sub
    
    Public Shared Sub M2(ByVal s As String) 
        Console.WriteLine("Shared method M2 on C:  s = {0}", s)
    End Sub
End Class

Public Class Example
    
    Public Shared Sub Main() 

        Dim c1 As New C(42)
        
        ' Get a MethodInfo for each method.
        '
        Dim mi1 As MethodInfo = GetType(C).GetMethod("M1", _
            BindingFlags.Public Or BindingFlags.Instance)
        Dim mi2 As MethodInfo = GetType(C).GetMethod("M2", _
            BindingFlags.Public Or BindingFlags.Static)
        
        Dim d1 As D1
        Dim d2 As D2
        Dim d3 As D3
        
        
        Console.WriteLine(vbLf & "An instance method closed over C.")
        ' In this case, the delegate and the
        ' method must have the same list of argument types; use
        ' delegate type D2 with instance method M1.
        '
        Dim test As [Delegate] = _
            [Delegate].CreateDelegate(GetType(D2), c1, mi1, False)

        ' Because False was specified for throwOnBindFailure 
        ' in the call to CreateDelegate, the variable 'test'
        ' contains Nothing if the method fails to bind (for 
        ' example, if mi1 happened to represent a method of 
        ' some class other than C).
        '
        If test IsNot Nothing Then
            d2 = CType(test, D2)

            ' The same instance of C is used every time the
            ' delegate is invoked.
            d2("Hello, World!")
            d2("Hi, Mom!")
        End If
        
        
        Console.WriteLine(vbLf & "An open instance method.")
        ' In this case, the delegate has one more 
        ' argument than the instance method; this argument comes
        ' at the beginning, and represents the hidden instance
        ' argument of the instance method. Use delegate type D1
        ' with instance method M1.
        '
        d1 = CType([Delegate].CreateDelegate(GetType(D1), Nothing, mi1), D1)
        
        ' An instance of C must be passed in each time the 
        ' delegate is invoked.
        '
        d1(c1, "Hello, World!")
        d1(New C(5280), "Hi, Mom!")
        
        
        Console.WriteLine(vbLf & "An open Shared method.")
        ' In this case, the delegate and the method must 
        ' have the same list of argument types; use delegate type
        ' D2 with Shared method M2.
        '
        d2 = CType([Delegate].CreateDelegate(GetType(D2), Nothing, mi2), D2)
        
        ' No instances of C are involved, because this is a Shared
        ' method. 
        '
        d2("Hello, World!")
        d2("Hi, Mom!")
        
        
        Console.WriteLine(vbLf & "A Shared method closed over the first argument (String).")
        ' The delegate must omit the first argument of the method.
        ' A string is passed as the firstArgument parameter, and 
        ' the delegate is bound to this string. Use delegate type 
        ' D3 with Shared method M2. 
        '
        d3 = CType([Delegate].CreateDelegate(GetType(D3), "Hello, World!", mi2), D3)
        
        ' Each time the delegate is invoked, the same string is
        ' used.
        d3()
    
    End Sub
End Class

' This code example produces the following output:
'
'An instance method closed over C.
'Instance method M1 on C:  id = 42, s = Hello, World!
'Instance method M1 on C:  id = 42, s = Hi, Mom!
'
'An open instance method.
'Instance method M1 on C:  id = 42, s = Hello, World!
'Instance method M1 on C:  id = 5280, s = Hi, Mom!
'
'An open Shared method.
'Shared method M2 on C:  s = Hello, World!
'Shared method M2 on C:  s = Hi, Mom!
'
'A Shared method closed over the first argument (String).
'Shared method M2 on C:  s = Hello, World!
' 

Пример 2Example 2

В следующем примере кода демонстрируется совместимость типов параметров и возвращаемых типов.The following code example demonstrates compatibility of parameter types and return types.

Примечание

В CreateDelegate(Type, MethodInfo) этом примере кода используется перегрузка метода.This code example uses the CreateDelegate(Type, MethodInfo) method overload. Использование других перегрузок, которые принимаются MethodInfo , аналогично.The use of other overloads that take MethodInfo is similar.

В примере кода определяется базовый класс с именем Base и Derived класс, производный от Base.The code example defines a base class named Base and a class named Derived that derives from Base. Производный static класс имеет метод (Shared в Visual Basic) с именем MyMethod с одним параметром типа Base и типом возвращаемого значения Derived.The derived class has a static (Shared in Visual Basic) method named MyMethod with one parameter of type Base and a return type of Derived. В примере кода также определяется делегат с именем Example с одним параметром типа Derived и типом возвращаемого значения Base.The code example also defines a delegate named Example that has one parameter of type Derived and a return type of Base.

В примере кода показано, что для представления Example метода MyMethodможно использовать делегат с именем.The code example demonstrates that the delegate named Example can be used to represent the method MyMethod. Метод можно привязать к делегату по следующим причинам:The method can be bound to the delegate because:

  • ТипDerivedпараметра делегата () более ограничен, чем MyMethod тип параметра (Base), чтобы всегда быть уверенным MyMethodв передаче аргумента делегата.The parameter type of the delegate (Derived) is more restrictive than the parameter type of MyMethod (Base), so that it is always safe to pass the argument of the delegate to MyMethod.

  • Тип возвращаемого значения MyMethod (Derived) является более строгой, чем тип параметра делегата (Base), чтобы всегда быть уверенным в том, чтобы привести возвращаемый тип метода к возвращаемому типу делегата.The return type of MyMethod (Derived) is more restrictive than the parameter type of the delegate (Base), so that it is always safe to cast the return type of the method to the return type of the delegate.

В примере кода выходные данные не создаются.The code example produces no output.

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());
}
using System;
using System.Reflection;

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

public 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 new Derived();
    }
}

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

class Test
{
    public static void Main()
    {
        // The binding flags needed to retrieve MyMethod.
        BindingFlags flags = BindingFlags.Public | BindingFlags.Static;

        // Get a MethodInfo that represents MyMethod.
        MethodInfo minfo = typeof(Derived).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(typeof(Example), minfo);

        // Execute MyMethod using the delegate Example.
        //        
        Base b = ex(new Derived());
    }
}
Imports System.Reflection

' Define two classes to use in the demonstration, a base class and 
' a class that derives from it.
'
Public Class Base
End Class

Public Class Derived
    Inherits Base

    ' Define a Shared 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 Shared Function MyMethod(ByVal arg As Base) As Derived
        Dim dummy As Base = arg
        Return New Derived()
    End Function

End Class

' Define a delegate that takes an instance of Derived and returns an
' instance of Base.
'
Public Delegate Function Example(ByVal arg As Derived) As Base

Module Test

    Sub Main()

        ' The binding flags needed to retrieve MyMethod.
        Dim flags As BindingFlags = _
            BindingFlags.Public Or BindingFlags.Static

        ' Get a MethodInfo that represents MyMethod.
        Dim minfo As MethodInfo = _
            GetType(Derived).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). 
        '
        Dim ex As Example = CType( _
            [Delegate].CreateDelegate(GetType(Example), minfo), _
            Example _
        )

        ' Execute MyMethod using the delegate Example.
        '        
        Dim b As Base = ex(New Derived())
    End Sub
End Module

Пример 3Example 3

В следующем примере кода показаны все методы, которые может представлять один тип делегата, с CreateDelegate помощью метода для создания делегатов.The following code example shows all the methods a single delegate type can represent, using the CreateDelegate method to create the delegates.

Примечание

Существует две перегрузки CreateDelegate метода, которые задают firstArgument и MethodInfo; их функциональные возможности одинаковы, за исключением того, что позволяет указать, следует ли создавать привязку при ошибке, а вторая всегда создает исключение.There are two overloads of the CreateDelegate method that specify firstArgument and a MethodInfo; their functionality is the same except that one allows you to specify whether to throw on failure to bind, and the other always throws. В этом примере кода используются обе перегрузки.This code example uses both overloads.

В примере кода определяются два класса C : Fи, и тип D делегата с одним аргументом Cтипа.The code example defines two classes, C and F, and a delegate type D with one argument of type C. Классы имеют совпадающие статические методы и M1метод M3экземпляра, M4, и, C а класс также имеет метод M2 экземпляра, не имеющий аргументов.The classes have matching static and instance methods M1, M3, and M4, and class C also has an instance method M2 that has no arguments.

Третий класс с именем Example содержит код, создающий делегаты.A third class named Example contains the code that creates the delegates.

  • Делегаты создаются для метода M1 экземпляра типа C и типа F, каждый из которых закрыт для экземпляра соответствующего типа.Delegates are created for instance method M1 of type C and type F; each is closed over an instance of the respective type. Метод M1 типа C отображаетID свойства привязанного экземпляра и аргумента.Method M1 of type C displays the ID properties of the bound instance and of the argument.

  • Делегат создается для метода M2 типа. CA delegate is created for method M2 of type C. Это делегат открытого экземпляра, в котором аргумент делегата представляет собой скрытый первый аргумент в методе экземпляра.This is an open instance delegate, in which the argument of the delegate represents the hidden first argument on the instance method. Метод не имеет других аргументов.The method has no other arguments. Он вызывается, как если бы он был статическим методом.It is called as if it were a static method.

  • Делегаты создаются для статического метода M3 типа C и типа F. это открытые статические делегаты.Delegates are created for static method M3 of type C and type F; these are open static delegates.

  • Наконец, делегаты создаются для статического метода M4 типа C и типа F; каждый метод имеет объявляющий тип в качестве первого аргумента и предоставляется экземпляр типа, поэтому делегаты закрываются по первым аргументам. .Finally, delegates are created for static method M4 of type C and type F; each method has the declaring type as its first argument, and an instance of the type is supplied, so the delegates are closed over their first arguments. Метод M4 типа C отображаетID свойства привязанного экземпляра и аргумента.Method M4 of type C displays the ID properties of the bound instance and of the argument.

using System;
using System.Reflection;
using System.Security.Permissions;

// Declare a delegate type. The object of this code example
// is to show all the methods this delegate can bind to.
//
public delegate void D(C c);

// Declare two sample classes, C and F. Class C has an ID
// property so instances can be identified.
//
public class C
{
    private int id;
    public int ID { get { return id; }}
    public C(int id) { this.id = id; }

    public void M1(C c) 
    { 
        Console.WriteLine("Instance method M1(C c) on C:  this.id = {0}, c.ID = {1}",
            this.id, c.ID);
    }
  
    public void M2() 
    { 
        Console.WriteLine("Instance method M2() on C:  this.id = {0}",
            this.id);
    }
  
    public static void M3(C c)
    { 
        Console.WriteLine("Static method M3(C c) on C:  c.ID = {0}", c.ID); 
    }

    public static void M4(C c1, C c2) 
    { 
        Console.WriteLine("Static method M4(C c1, C c2) on C:  c1.ID = {0}, c2.ID = {1}",
            c1.ID, c2.ID);
    }
}

public class F
{
    public void M1(C c) 
    { 
        Console.WriteLine("Instance method M1(C c) on F:  c.ID = {0}",
            c.ID);
    }
  
    public static void M3(C c)
    { 
        Console.WriteLine("Static method M3(C c) on F:  c.ID = {0}", c.ID); 
    }

    public static void M4(F f, C c) 
    { 
        Console.WriteLine("Static method M4(F f, C c) on F:  c.ID = {0}",
            c.ID);
    }
}


public class Example
{
    public static void Main()
    {
        C c1 = new C(42);
        C c2 = new C(1491);
        F f1 = new F();

        D d;

        // Instance method with one argument of type C.
        MethodInfo cmi1 = typeof(C).GetMethod("M1"); 
        // Instance method with no arguments.
        MethodInfo cmi2 = typeof(C).GetMethod("M2"); 
        // Static method with one argument of type C.
        MethodInfo cmi3 = typeof(C).GetMethod("M3"); 
        // Static method with two arguments of type C.
        MethodInfo cmi4 = typeof(C).GetMethod("M4"); 

        // Instance method with one argument of type C.
        MethodInfo fmi1 = typeof(F).GetMethod("M1");
        // Static method with one argument of type C.
        MethodInfo fmi3 = typeof(F).GetMethod("M3"); 
        // Static method with an argument of type F and an argument 
        // of type C.
        MethodInfo fmi4 = typeof(F).GetMethod("M4"); 

        Console.WriteLine("\nAn instance method on any type, with an argument of type C.");
        // D can represent any instance method that exactly matches its
        // signature. Methods on C and F are shown here.
        //
        d = (D) Delegate.CreateDelegate(typeof(D), c1, cmi1);
        d(c2);
        d = (D) Delegate.CreateDelegate(typeof(D), f1, fmi1);
        d(c2);

        Console.WriteLine("\nAn instance method on C with no arguments.");
        // D can represent an instance method on C that has no arguments;
        // in this case, the argument of D represents the hidden first
        // argument of any instance method. The delegate acts like a 
        // static method, and an instance of C must be passed each time
        // it is invoked.
        //
        d = (D) Delegate.CreateDelegate(typeof(D), null, cmi2);
        d(c1);

        Console.WriteLine("\nA static method on any type, with an argument of type C.");
        // D can represent any static method with the same signature.
        // Methods on F and C are shown here.
        //
        d = (D) Delegate.CreateDelegate(typeof(D), null, cmi3);
        d(c1);
        d = (D) Delegate.CreateDelegate(typeof(D), null, fmi3);
        d(c1);

        Console.WriteLine("\nA static method on any type, with an argument of");
        Console.WriteLine("    that type and an argument of type C.");
        // D can represent any static method with one argument of the
        // type the method belongs and a second argument of type C.
        // In this case, the method is closed over the instance of
        // supplied for the its first argument, and acts like an instance
        // method. Methods on F and C are shown here.
        //
        d = (D) Delegate.CreateDelegate(typeof(D), c1, cmi4);
        d(c2);
        Delegate test = 
            Delegate.CreateDelegate(typeof(D), f1, fmi4, false);

        // This final example specifies false for throwOnBindFailure 
        // in the call to CreateDelegate, so the variable 'test'
        // contains Nothing if the method fails to bind (for 
        // example, if fmi4 happened to represent a method of  
        // some class other than F).
        //
        if (test != null)
        {
            d = (D) test;
            d(c2);
        }
    }
}

/* This code example produces the following output:

An instance method on any type, with an argument of type C.
Instance method M1(C c) on C:  this.id = 42, c.ID = 1491
Instance method M1(C c) on F:  c.ID = 1491

An instance method on C with no arguments.
Instance method M2() on C:  this.id = 42

A static method on any type, with an argument of type C.
Static method M3(C c) on C:  c.ID = 42
Static method M3(C c) on F:  c.ID = 42

A static method on any type, with an argument of
    that type and an argument of type C.
Static method M4(C c1, C c2) on C:  c1.ID = 42, c2.ID = 1491
Static method M4(F f, C c) on F:  c.ID = 1491
*/
Imports System.Reflection
Imports System.Security.Permissions

' Declare a delegate type. The object of this code example
' is to show all the methods this delegate can bind to.
'
Public Delegate Sub D(ByVal c As C) 

' Declare two sample classes, C and F. Class C has an ID
' property so instances can be identified.
'
Public Class C

    Private _id As Integer

    Public ReadOnly Property ID() As Integer 
        Get
            Return _id
        End Get
    End Property

    Public Sub New(ByVal newId As Integer) 
        Me._id = newId
    End Sub
    
    Public Sub M1(ByVal c As C) 
        Console.WriteLine("Instance method M1(c As C) on C:  this.id = {0}, c.ID = {1}", _
            Me.id, c.ID)
    End Sub
    
    Public Sub M2() 
        Console.WriteLine("Instance method M2() on C:  this.id = {0}", Me.id)
    End Sub
    
    Public Shared Sub M3(ByVal c As C) 
        Console.WriteLine("Shared method M3(c As C) on C:  c.ID = {0}", c.ID)
    End Sub
    
    Public Shared Sub M4(ByVal c1 As C, ByVal c2 As C) 
        Console.WriteLine("Shared method M4(c1 As C, c2 As C) on C:  c1.ID = {0}, c2.ID = {1}", _
            c1.ID, c2.ID)
    End Sub
End Class


Public Class F
    
    Public Sub M1(ByVal c As C) 
        Console.WriteLine("Instance method M1(c As C) on F:  c.ID = {0}", c.ID)
    End Sub
    
    Public Shared Sub M3(ByVal c As C) 
        Console.WriteLine("Shared method M3(c As C) on F:  c.ID = {0}", c.ID)
    End Sub
    
    Public Shared Sub M4(ByVal f As F, ByVal c As C) 
        Console.WriteLine("Shared method M4(f As F, c As C) on F:  c.ID = {0}", c.ID)
    End Sub
End Class

Public Class Example
    
    Public Shared Sub Main() 

        Dim c1 As New C(42)
        Dim c2 As New C(1491)
        Dim f1 As New F()
        
        Dim d As D
        
        ' Instance method with one argument of type C.
        Dim cmi1 As MethodInfo = GetType(C).GetMethod("M1")
        ' Instance method with no arguments.
        Dim cmi2 As MethodInfo = GetType(C).GetMethod("M2")
        ' Shared method with one argument of type C.
        Dim cmi3 As MethodInfo = GetType(C).GetMethod("M3")
        ' Shared method with two arguments of type C.
        Dim cmi4 As MethodInfo = GetType(C).GetMethod("M4")
        
        ' Instance method with one argument of type C.
        Dim fmi1 As MethodInfo = GetType(F).GetMethod("M1")
        ' Shared method with one argument of type C.
        Dim fmi3 As MethodInfo = GetType(F).GetMethod("M3")
        ' Shared method with an argument of type F and an 
        ' argument of type C.
        Dim fmi4 As MethodInfo = GetType(F).GetMethod("M4")
        
        Console.WriteLine(vbLf & "An instance method on any type, with an argument of type C.")
        ' D can represent any instance method that exactly matches its
        ' signature. Methods on C and F are shown here.
        '
        d = CType([Delegate].CreateDelegate(GetType(D), c1, cmi1), D)
        d(c2)
        d = CType([Delegate].CreateDelegate(GetType(D), f1, fmi1), D)
        d(c2)
        
        Console.WriteLine(vbLf & "An instance method on C with no arguments.")
        ' D can represent an instance method on C that has no arguments;
        ' in this case, the argument of D represents the hidden first
        ' argument of any instance method. The delegate acts like a 
        ' Shared method, and an instance of C must be passed each time
        ' it is invoked.
        '
        d = CType([Delegate].CreateDelegate(GetType(D), Nothing, cmi2), D)
        d(c1)
        
        Console.WriteLine(vbLf & "A Shared method on any type, with an argument of type C.")
        ' D can represent any Shared method with the same signature.
        ' Methods on F and C are shown here.
        '
        d = CType([Delegate].CreateDelegate(GetType(D), Nothing, cmi3), D)
        d(c1)
        d = CType([Delegate].CreateDelegate(GetType(D), Nothing, fmi3), D)
        d(c1)
        
        Console.WriteLine(vbLf & "A Shared method on any type, with an argument of")
        Console.WriteLine("    that type and an argument of type C.")
        ' D can represent any Shared method with one argument of the
        ' type the method belongs and a second argument of type C.
        ' In this case, the method is closed over the instance of
        ' supplied for the its first argument, and acts like an instance
        ' method. Methods on F and C are shown here.
        '
        d = CType([Delegate].CreateDelegate(GetType(D), c1, cmi4), D)
        d(c2)
        Dim test As [Delegate] = _
            [Delegate].CreateDelegate(GetType(D), f1, fmi4, false)

        ' This final example specifies False for throwOnBindFailure 
        ' in the call to CreateDelegate, so the variable 'test'
        ' contains Nothing if the method fails to bind (for 
        ' example, if fmi4 happened to represent a method of  
        ' some class other than F).
        '
        If test IsNot Nothing Then
            d = CType(test, D)
            d(c2)
        End If
    
    End Sub
End Class

' This code example produces the following output:
'
'An instance method on any type, with an argument of type C.
'Instance method M1(c As C) on C:  this.id = 42, c.ID = 1491
'Instance method M1(c As C) on F:  c.ID = 1491
'
'An instance method on C with no arguments.
'Instance method M2() on C:  this.id = 42
'
'A Shared method on any type, with an argument of type C.
'Shared method M3(c As C) on C:  c.ID = 42
'Shared method M3(c As C) on F:  c.ID = 42
'
'A Shared method on any type, with an argument of
'    that type and an argument of type C.
'Shared method M4(c1 As C, c2 As C) on C:  c1.ID = 42, c2.ID = 1491
'Shared method M4(f As F, c As C) on F:  c.ID = 1491
'

Комментарии

Вызов этой перегрузки метода эквивалентен вызову CreateDelegate(Type, Object, MethodInfo, Boolean) перегрузки метода и указанию true для throwOnBindFailure.Calling this method overload is equivalent to calling the CreateDelegate(Type, Object, MethodInfo, Boolean) method overload and specifying true for throwOnBindFailure. Эти две перегрузки обеспечивают наиболее гибкий способ создания делегатов.These two overloads provide the most flexible way to create delegates. Их можно использовать для создания делегатов для статических методов или, а также для указания первого аргумента.You can use them to create delegates for either static or instance methods, and optionally to specify the first argument.

Примечание

Если не указать первый аргумент, используйте CreateDelegate(Type, MethodInfo) перегрузку метода для повышения производительности.If you do not supply a first argument, use the CreateDelegate(Type, MethodInfo) method overload for better performance.

Тип делегата и метод должны иметь совместимые типы возвращаемых значения.The delegate type and the method must have compatible return types. То есть тип method возвращаемого значения должен быть назначен возвращаемому typeтипу.That is, the return type of method must be assignable to the return type of type.

Если firstArgument указан аргумент, он method передается при каждом вызове делегата; firstArgument считается привязанным к делегату, и делегат называется закрытым для своего первого аргумента.If firstArgument is supplied, it is passed to method every time the delegate is invoked; firstArgument is said to be bound to the delegate, and the delegate is said to be closed over its first argument. Если method имеет static значение(Shared в Visual Basic), список аргументов, предоставленный при вызове делегата, включает все параметры, кроме method первого; если является методом экземпляра firstArgument , то передается в скрытый экземпляр. параметр (представленный this в C#или Me в Visual Basic).If method is static (Shared in Visual Basic), the argument list supplied when invoking the delegate includes all parameters except the first; if method is an instance method, then firstArgument is passed to the hidden instance parameter (represented by this in C#, or by Me in Visual Basic).

Если firstArgument указан аргумент, первый method параметр должен быть ссылочным типом и firstArgument должен быть совместим с этим типом.If firstArgument is supplied, the first parameter of method must be a reference type, and firstArgument must be compatible with that type.

Важно!

Если method имеет firstArgument ValueType Object значение (Shared в Visual Basic) и его первый параметр имеет тип или, то может быть типом значения. staticIf method is static (Shared in Visual Basic) and its first parameter is of type Object or ValueType, then firstArgument can be a value type. В этом случае firstArgument автоматически упаковывается.In this case firstArgument is automatically boxed. Автоматическая упаковка- C# преобразование не выполняется для других аргументов, как в вызове функции или Visual Basic.Automatic boxing does not occur for any other arguments, as it would in a C# or Visual Basic function call.

Если firstArgument является пустой ссылкой и method является методом экземпляра, результат зависит от сигнатур типа type делегата и method:If firstArgument is a null reference and method is an instance method, the result depends on the signatures of the delegate type type and of method:

  • Если сигнатура type явно включает в себя скрытый первый methodпараметр, то говорят, что делегат представляет открытый метод экземпляра.If the signature of type explicitly includes the hidden first parameter of method, the delegate is said to represent an open instance method. При вызове делегата первый аргумент в списке аргументов передается в параметр methodскрытого экземпляра.When the delegate is invoked, the first argument in the argument list is passed to the hidden instance parameter of method.

  • Если сигнатуры method и type совпадают (то есть все типы параметров совместимы), делегат считается закрытым по пустой ссылке.If the signatures of method and type match (that is, all parameter types are compatible), then the delegate is said to be closed over a null reference. Вызов делегата аналогичен вызову метода экземпляра для экземпляра со значением NULL, что не особенно полезно для этого.Invoking the delegate is like calling an instance method on a null instance, which is not a particularly useful thing to do.

Если firstArgument параметр является пустой ссылкой и method является статическим, результат зависит от сигнатур типа type делегата и method:If firstArgument is a null reference and method is static, the result depends on the signatures of the delegate type type and of method:

  • Если сигнатура method и type совпадает (то есть все типы параметров совместимы), делегат называется открытым статическим методом.If the signature of method and type match (that is, all parameter types are compatible), the delegate is said to represent an open static method. Это наиболее распространенный случай для статических методов.This is the most common case for static methods. В этом случае можно получить немного более высокую производительность с помощью CreateDelegate(Type, MethodInfo) перегрузки метода.In this case, you can get slightly better performance by using the CreateDelegate(Type, MethodInfo) method overload.

  • Если сигнатура type начинается со второго method параметра, а остальные типы параметров совместимы, то делегат называется закрытым с помощью пустой ссылки.If the signature of type begins with the second parameter of method and the rest of the parameter types are compatible, then the delegate is said to be closed over a null reference. При вызове делегата в первый параметр метода methodпередается пустая ссылка.When the delegate is invoked, a null reference is passed to the first parameter of method.

Примечание

Начиная с .NET Framework 2.0 с пакетом обновления 1 (SP1).NET Framework 2.0 Service Pack 1, этот метод можно использовать для доступа к закрытым методам, если вызывающему объекту был предоставлен ReflectionPermission ReflectionPermissionFlag.RestrictedMemberAccess флаг, и если набор разрешений неоткрытых методов ограничен набором предоставления вызывающего объекта или подмножеством сочетани.Starting with the .NET Framework 2.0 с пакетом обновления 1 (SP1).NET Framework 2.0 Service Pack 1, this method can be used to access non-public methods if the caller has been granted ReflectionPermission with the ReflectionPermissionFlag.RestrictedMemberAccess flag and if the grant set of the non-public methods is restricted to the caller's grant set, or a subset thereof. (См. раздел вопросы безопасности для отражения.)(See Security Considerations for Reflection.)

Для применения этих функциональных возможностей приложение должно использовать .NET Framework 3,5.NET Framework 3.5 или более поздние версии.To use this functionality, your application should target the .NET Framework 3,5.NET Framework 3.5 or later.

Совместимые типы параметров и возвращаемый типCompatible Parameter Types and Return Type

Типы параметров и возвращаемый тип делегата должны быть совместимы с типами параметров и типом возвращаемого значения метода, который представляет делегат. типы не обязательно должны точно совпадать.The parameter types and return type of a delegate must be compatible with the parameter types and return type of the method the delegate represents; the types do not have to match exactly.

Примечание

В .NET Framework версии 1,0 и 1,1 типы должны точно совпадать.In the .NET Framework version 1.0 and 1.1, the types must match exactly.

Если тип параметра делегата является более строгим, чем тип параметра метода, то параметр делегата совместим с соответствующим параметром метода, так как это гарантирует, что аргумент, переданный делегату, может быть безопасно передан методу.A parameter of a delegate is compatible with the corresponding parameter of a method if the type of the delegate parameter is more restrictive than the type of the method parameter, because this guarantees that an argument passed to the delegate can be passed safely to the method.

Аналогичным образом, тип возвращаемого значения делегата совместим с типом возвращаемого значения метода, если тип возвращаемого значения метода является более строгим, чем тип возвращаемого значения делегата, так как это гарантирует, что возвращаемое значение метода может быть безопасно приведено к типу возвращаемого значения делегата.Similarly, the return type of a delegate is compatible with the return type of a method if the return type of the method is more restrictive than the return type of the delegate, because this guarantees that the return value of the method can be cast safely to the return type of the delegate.

Например, делегат Hashtable с параметром типа и Object типом возвращаемого значения может представлять метод с параметром типа Object и возвращаемым значением типа Hashtable.For example, a delegate with a parameter of type Hashtable and a return type of Object can represent a method with a parameter of type Object and a return value of type Hashtable.

Определение методов, которые может представлять делегатDetermining the Methods a Delegate Can Represent

Еще один полезный способ представить гибкость, обеспечиваемую этой перегрузкой CreateDelegate , заключается в том, что любой заданный делегат может представлять четыре различных сочетания сигнатуры и типа метода (статический и экземпляр).Another useful way to think of the flexibility provided by this overload of CreateDelegate is that any given delegate can represent four different combinations of method signature and method kind (static versus instance). Рассмотрим тип D делегата с одним аргументом типа C.Consider a delegate type D with one argument of type C. Ниже описаны методы D , которые могут представлять, игнорируя возвращаемый тип, так как он должен совпадать во всех случаях:The following describes the methods D can represent, ignoring the return type since it must match in all cases:

  • Dможет представлять любой метод экземпляра, имеющий только один аргумент типа C, независимо от того, к какому типу относится метод экземпляра.D can represent any instance method that has exactly one argument of type C, regardless of what type the instance method belongs to. При CreateDelegate method вызове метод является экземпляром типа, а получившийся делегат называется закрытым для этого экземпляра. firstArgumentWhen CreateDelegate is called, firstArgument is an instance of the type method belongs to, and the resulting delegate is said to be closed over that instance. (Тривиальный элемент D также может быть закрыт над пустой ссылкой, если firstArgument является пустой ссылкой.)(Trivially, D can also be closed over a null reference if firstArgument is a null reference.)

  • Dможет представлять метод C экземпляра, не имеющий аргументов.D can represent an instance method of C that has no arguments. CreateDelegate ПриfirstArgument вызове метода является пустой ссылкой.When CreateDelegate is called, firstArgument is a null reference. Результирующий делегат представляет открытый метод экземпляра, а экземпляр C должен предоставляться каждый раз при вызове метода.The resulting delegate represents an open instance method, and an instance of C must be supplied each time it is invoked.

  • Dможет представлять статический метод, который принимает один аргумент типа C, и этот метод может принадлежать любому типу.D can represent a static method that takes one argument of type C, and that method can belong to any type. CreateDelegate ПриfirstArgument вызове метода является пустой ссылкой.When CreateDelegate is called, firstArgument is a null reference. Результирующий делегат представляет открытый статический метод, а экземпляр C должен предоставляться каждый раз при вызове метода.The resulting delegate represents an open static method, and an instance of C must be supplied each time it is invoked.

  • Dможет представлять статический метод, принадлежащий типу F и имеющий два аргумента типа F и типа C.D can represent a static method that belongs to type F and has two arguments, of type F and type C. При CreateDelegate Fвызове метод является экземпляром. firstArgumentWhen CreateDelegate is called, firstArgument is an instance of F. Результирующий делегат представляет статический метод, закрытый для этого экземпляра F.The resulting delegate represents a static method that is closed over that instance of F. Обратите внимание, что в F случае C , когда и относятся к одному и тому же типу, статический метод имеет два аргумента этого типа.Note that in the case where F and C are the same type, the static method has two arguments of that type. (В данном случае закрывается по пустой ссылке, D если firstArgument является пустой ссылкой.)(In this case, D is closed over a null reference if firstArgument is a null reference.)

Безопасность

ReflectionPermission
При вызове поздней привязки с помощью таких механизмов InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]), как.when invoked late-bound through mechanisms such as InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]). Связанное перечисление: MemberAccess.Associated enumeration: MemberAccess.

Дополнительно

CreateDelegate(Type, Type, String)

Создает делегат указанного типа, представляющий заданный статический метод заданного класса.Creates a delegate of the specified type that represents the specified static method of the specified class.

public:
 static Delegate ^ CreateDelegate(Type ^ type, Type ^ target, System::String ^ method);
public static Delegate CreateDelegate (Type type, Type target, string method);
static member CreateDelegate : Type * Type * string -> Delegate

Параметры

type
Type

Тип Type создаваемого делегата.The Type of delegate to create.

target
Type

Тип Type, представляющий класс, в котором реализован метод method.The Type representing the class that implements method.

method
String

Имя статического метода, который должен быть представлен делегатом.The name of the static method that the delegate is to represent.

Возвраты

Делегат указанного типа, представляющий заданный статический метод заданного класса.A delegate of the specified type that represents the specified static method of the specified class.

Исключения

Свойство type имеет значение null.type is null.

- или --or- Свойство target имеет значение null.target is null.

- или --or- methodnull.method is null.

type не является производным от MulticastDelegate.type does not inherit MulticastDelegate.

-или--or- type не является объектом типа RuntimeType.type is not a RuntimeType. См. статью Типы среды выполнения в отражении.See Runtime Types in Reflection.

- или --or- target не является объектом RuntimeType.target is not a RuntimeType.

-или--or- Параметр target является открытым универсальным типом.target is an open generic type. То есть свойство ContainsGenericParameters имеет значение true.That is, its ContainsGenericParameters property is true.

-или--or- method не является методом static (метод Shared в Visual Basic).method is not a static method (Shared method in Visual Basic).

- или --or- Параметр method невозможно привязать, например, потому, что его невозможно найти, а throwOnBindFailure имеет значение true.method cannot be bound, for example because it cannot be found, and throwOnBindFailure is true.

Метод Invoke для type не найден.The Invoke method of type is not found.

Вызывающий объект не имеет необходимых разрешений для доступа к method.The caller does not have the permissions necessary to access method.

Комментарии

Этот метод создает делегаты только для статических методов.This method creates delegates for static methods only. Метод экземпляра — это метод, связанный с экземпляром класса; статический метод — это метод, который связан с самим классом.An instance method is a method that is associated with an instance of a class; a static method is a method that is associated with the class itself.

Перегрузка этого CreateDelegate(Type, Type, String, Boolean, Boolean) метода эквивалентна вызову перегрузки метода, указывающей true false для throwOnBindFailure ignoreCase и для.This method overload is equivalent to calling the CreateDelegate(Type, Type, String, Boolean, Boolean) method overload, specifying false for ignoreCase and true for throwOnBindFailure.

Примечание

Начиная с .NET Framework 2.0 с пакетом обновления 1 (SP1).NET Framework 2.0 Service Pack 1, этот метод можно использовать для доступа к закрытым методам, если вызывающему объекту был предоставлен ReflectionPermission ReflectionPermissionFlag.RestrictedMemberAccess флаг, и если набор разрешений неоткрытых методов ограничен набором предоставления вызывающего объекта или подмножеством сочетани.Starting with the .NET Framework 2.0 с пакетом обновления 1 (SP1).NET Framework 2.0 Service Pack 1, this method can be used to access non-public methods if the caller has been granted ReflectionPermission with the ReflectionPermissionFlag.RestrictedMemberAccess flag and if the grant set of the non-public methods is restricted to the caller's grant set, or a subset thereof. (См. раздел вопросы безопасности для отражения.)(See Security Considerations for Reflection.)

Для применения этих функциональных возможностей приложение должно использовать .NET Framework 3,5.NET Framework 3.5 или более поздние версии.To use this functionality, your application should target the .NET Framework 3,5.NET Framework 3.5 or later.

Безопасность

ReflectionPermission
При вызове поздней привязки с помощью таких механизмов InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]), как.when invoked late-bound through mechanisms such as InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]). Связанное перечисление: MemberAccess.Associated enumeration: MemberAccess.

Дополнительно

CreateDelegate(Type, MethodInfo)

Создает делегат указанного типа, представляющий заданный статический метод.Creates a delegate of the specified type to represent the specified static method.

public:
 static Delegate ^ CreateDelegate(Type ^ type, System::Reflection::MethodInfo ^ method);
public static Delegate CreateDelegate (Type type, System.Reflection.MethodInfo method);
static member CreateDelegate : Type * System.Reflection.MethodInfo -> Delegate

Параметры

type
Type

Type создаваемого делегата.The Type of delegate to create.

method
MethodInfo

MethodInfo, описывающий статический метод или метод экземпляра, который будет представлен делегатом.The MethodInfo describing the static or instance method the delegate is to represent. На платформе .NET Framework версий 1.0 и 1.1 поддерживаются только статические методы.Only static methods are supported in the .NET Framework version 1.0 and 1.1.

Возвраты

Делегат указанного типа, представляющий заданный статический метод.A delegate of the specified type to represent the specified static method.

Исключения

Свойство type имеет значение null.type is null.

- или --or- Свойство method имеет значение null.method is null.

type не является производным от MulticastDelegate.type does not inherit MulticastDelegate.

-или--or- type не является объектом типа RuntimeType.type is not a RuntimeType. См. статью Типы среды выполнения в отражении.See Runtime Types in Reflection.

-или--or- method не является статическим методом и платформа .NET Framework имеет версию 1.0 или 1.1.method is not a static method, and the .NET Framework version is 1.0 or 1.1.

-или--or- Не удалось выполнить связывание method.method cannot be bound.

-или--or- method не является объектом типа RuntimeMethodInfo.method is not a RuntimeMethodInfo. См. статью Типы среды выполнения в отражении.See Runtime Types in Reflection.

Метод Invoke типа type не найден.The Invoke method of type is not found.

Вызывающий объект не имеет необходимых разрешений для доступа к method.The caller does not have the permissions necessary to access method.

Примеры

Этот раздел содержит два примера кода.This section contains two code examples. В первом примере показаны два вида делегатов, которые можно создать с помощью этой перегрузки метода: открыть через метод экземпляра и открыть в статическом методе.The first example demonstrates the two kinds of delegates that can be created with this method overload: open over an instance method and open over a static method.

Во втором примере кода демонстрируются совместимые типы параметров и возвращаемые типы.The second code example demonstrates compatible parameter types and return types.

Пример 1Example 1

В следующем примере кода показаны два способа создания делегата с помощью этой перегрузки CreateDelegate метода.The following code example demonstrates the two ways a delegate can be created using this overload of the CreateDelegate method.

Примечание

Существует две перегрузки CreateDelegate метода, указывающие, MethodInfo но не первый аргумент; их функциональные возможности одинаковы, за исключением того, что можно указать, следует ли создавать привязку при сбое, а другое всегда создает исключение.There are two overloads of the CreateDelegate method that specify a MethodInfo but not a first argument; their functionality is the same except that one allows you to specify whether to throw on failure to bind, and the other always throws. В этом примере кода используются обе перегрузки.This code example uses both overloads.

В примере объявляется C класс со статическим методом M2 и методом M1экземпляра, а также C два типа делегата: D1 принимает экземпляр и строку и D2 принимает строку.The example declares a class C with a static method M2 and an instance method M1, and two delegate types: D1 takes an instance of C and a string, and D2 takes a string.

Второй класс с именем Example содержит код, создающий делегаты.A second class named Example contains the code that creates the delegates.

  • Делегат типа D1, представляющий открытый метод экземпляра, создается для метода M1экземпляра.A delegate of type D1, representing an open instance method, is created for the instance method M1. Экземпляр должен передаваться при вызове делегата.An instance must be passed when the delegate is invoked.

  • Для статического метода M2создается D2делегат типа, представляющий открытый статический метод.A delegate of type D2, representing an open static method, is created for the static method M2.

using System;
using System.Reflection;
using System.Security.Permissions;

// Declare three delegate types for demonstrating the combinations
// of static versus instance methods and open versus closed
// delegates.
//
public delegate void D1(C c, string s);
public delegate void D2(string s);
public delegate void D3();

// A sample class with an instance method and a static method.
//
public class C
{
    private int id;
    public C(int id) { this.id = id; }

    public void M1(string s) 
    { 
        Console.WriteLine("Instance method M1 on C:  id = {0}, s = {1}",
            this.id, s);
    }
  
    public static void M2(string s)
    { 
        Console.WriteLine("Static method M2 on C:  s = {0}", s); 
    }
}

public class Example
{
    public static void Main()
    {
        C c1 = new C(42);

        // Get a MethodInfo for each method.
        //
        MethodInfo mi1 = typeof(C).GetMethod("M1", 
            BindingFlags.Public | BindingFlags.Instance);
        MethodInfo mi2 = typeof(C).GetMethod("M2",
            BindingFlags.Public | BindingFlags.Static);

        D1 d1;
        D2 d2;
        D3 d3;


        Console.WriteLine("\nAn instance method closed over C.");
        // In this case, the delegate and the
        // method must have the same list of argument types; use
        // delegate type D2 with instance method M1.
        //
        Delegate test = 
            Delegate.CreateDelegate(typeof(D2), c1, mi1, false);

        // Because false was specified for throwOnBindFailure 
        // in the call to CreateDelegate, the variable 'test'
        // contains null if the method fails to bind (for 
        // example, if mi1 happened to represent a method of  
        // some class other than C).
        //
        if (test != null)
        {
            d2 = (D2) test;

            // The same instance of C is used every time the 
            // delegate is invoked.
            d2("Hello, World!");
            d2("Hi, Mom!");
        }


        Console.WriteLine("\nAn open instance method.");
        // In this case, the delegate has one more 
        // argument than the instance method; this argument comes
        // at the beginning, and represents the hidden instance
        // argument of the instance method. Use delegate type D1
        // with instance method M1.
        //
        d1 = (D1) Delegate.CreateDelegate(typeof(D1), null, mi1);

        // An instance of C must be passed in each time the 
        // delegate is invoked.
        //
        d1(c1, "Hello, World!");
        d1(new C(5280), "Hi, Mom!");


        Console.WriteLine("\nAn open static method.");
        // In this case, the delegate and the method must 
        // have the same list of argument types; use delegate type
        // D2 with static method M2.
        //
        d2 = (D2) Delegate.CreateDelegate(typeof(D2), null, mi2);

        // No instances of C are involved, because this is a static
        // method. 
        //
        d2("Hello, World!");
        d2("Hi, Mom!");


        Console.WriteLine("\nA static method closed over the first argument (String).");
        // The delegate must omit the first argument of the method.
        // A string is passed as the firstArgument parameter, and 
        // the delegate is bound to this string. Use delegate type 
        // D3 with static method M2. 
        //
        d3 = (D3) Delegate.CreateDelegate(typeof(D3), 
            "Hello, World!", mi2);

        // Each time the delegate is invoked, the same string is
        // used.
        d3();
    }
}

/* This code example produces the following output:

An instance method closed over C.
Instance method M1 on C:  id = 42, s = Hello, World!
Instance method M1 on C:  id = 42, s = Hi, Mom!

An open instance method.
Instance method M1 on C:  id = 42, s = Hello, World!
Instance method M1 on C:  id = 5280, s = Hi, Mom!

An open static method.
Static method M2 on C:  s = Hello, World!
Static method M2 on C:  s = Hi, Mom!

A static method closed over the first argument (String).
Static method M2 on C:  s = Hello, World!
 */
Imports System.Reflection
Imports System.Security.Permissions

' Declare three delegate types for demonstrating the combinations
' of Shared versus instance methods and open versus closed
' delegates.
'
Public Delegate Sub D1(ByVal c As C, ByVal s As String) 
Public Delegate Sub D2(ByVal s As String) 
Public Delegate Sub D3() 

' A sample class with an instance method and a Shared method.
'
Public Class C
    Private id As Integer
    Public Sub New(ByVal id As Integer) 
        Me.id = id
    End Sub

    Public Sub M1(ByVal s As String) 
        Console.WriteLine("Instance method M1 on C:  id = {0}, s = {1}", _
            Me.id, s)
    End Sub
    
    Public Shared Sub M2(ByVal s As String) 
        Console.WriteLine("Shared method M2 on C:  s = {0}", s)
    End Sub
End Class

Public Class Example
    
    Public Shared Sub Main() 

        Dim c1 As New C(42)
        
        ' Get a MethodInfo for each method.
        '
        Dim mi1 As MethodInfo = GetType(C).GetMethod("M1", _
            BindingFlags.Public Or BindingFlags.Instance)
        Dim mi2 As MethodInfo = GetType(C).GetMethod("M2", _
            BindingFlags.Public Or BindingFlags.Static)
        
        Dim d1 As D1
        Dim d2 As D2
        Dim d3 As D3
        
        
        Console.WriteLine(vbLf & "An instance method closed over C.")
        ' In this case, the delegate and the
        ' method must have the same list of argument types; use
        ' delegate type D2 with instance method M1.
        '
        Dim test As [Delegate] = _
            [Delegate].CreateDelegate(GetType(D2), c1, mi1, False)

        ' Because False was specified for throwOnBindFailure 
        ' in the call to CreateDelegate, the variable 'test'
        ' contains Nothing if the method fails to bind (for 
        ' example, if mi1 happened to represent a method of 
        ' some class other than C).
        '
        If test IsNot Nothing Then
            d2 = CType(test, D2)

            ' The same instance of C is used every time the
            ' delegate is invoked.
            d2("Hello, World!")
            d2("Hi, Mom!")
        End If
        
        
        Console.WriteLine(vbLf & "An open instance method.")
        ' In this case, the delegate has one more 
        ' argument than the instance method; this argument comes
        ' at the beginning, and represents the hidden instance
        ' argument of the instance method. Use delegate type D1
        ' with instance method M1.
        '
        d1 = CType([Delegate].CreateDelegate(GetType(D1), Nothing, mi1), D1)
        
        ' An instance of C must be passed in each time the 
        ' delegate is invoked.
        '
        d1(c1, "Hello, World!")
        d1(New C(5280), "Hi, Mom!")
        
        
        Console.WriteLine(vbLf & "An open Shared method.")
        ' In this case, the delegate and the method must 
        ' have the same list of argument types; use delegate type
        ' D2 with Shared method M2.
        '
        d2 = CType([Delegate].CreateDelegate(GetType(D2), Nothing, mi2), D2)
        
        ' No instances of C are involved, because this is a Shared
        ' method. 
        '
        d2("Hello, World!")
        d2("Hi, Mom!")
        
        
        Console.WriteLine(vbLf & "A Shared method closed over the first argument (String).")
        ' The delegate must omit the first argument of the method.
        ' A string is passed as the firstArgument parameter, and 
        ' the delegate is bound to this string. Use delegate type 
        ' D3 with Shared method M2. 
        '
        d3 = CType([Delegate].CreateDelegate(GetType(D3), "Hello, World!", mi2), D3)
        
        ' Each time the delegate is invoked, the same string is
        ' used.
        d3()
    
    End Sub
End Class

' This code example produces the following output:
'
'An instance method closed over C.
'Instance method M1 on C:  id = 42, s = Hello, World!
'Instance method M1 on C:  id = 42, s = Hi, Mom!
'
'An open instance method.
'Instance method M1 on C:  id = 42, s = Hello, World!
'Instance method M1 on C:  id = 5280, s = Hi, Mom!
'
'An open Shared method.
'Shared method M2 on C:  s = Hello, World!
'Shared method M2 on C:  s = Hi, Mom!
'
'A Shared method closed over the first argument (String).
'Shared method M2 on C:  s = Hello, World!
' 

Пример 2Example 2

В следующем примере кода демонстрируется совместимость типов параметров и возвращаемых типов.The following code example demonstrates compatibility of parameter types and return types.

В примере кода определяется базовый класс с именем Base и Derived класс, производный от Base.The code example defines a base class named Base and a class named Derived that derives from Base. Производный static класс имеет метод (Shared в Visual Basic) с именем MyMethod с одним параметром типа Base и типом возвращаемого значения Derived.The derived class has a static (Shared in Visual Basic) method named MyMethod with one parameter of type Base and a return type of Derived. В примере кода также определяется делегат с именем Example с одним параметром типа Derived и типом возвращаемого значения Base.The code example also defines a delegate named Example that has one parameter of type Derived and a return type of Base.

В примере кода показано, что для представления Example метода MyMethodможно использовать делегат с именем.The code example demonstrates that the delegate named Example can be used to represent the method MyMethod. Метод можно привязать к делегату по следующим причинам:The method can be bound to the delegate because:

  • ТипDerivedпараметра делегата () более ограничен, чем MyMethod тип параметра (Base), чтобы всегда быть уверенным MyMethodв передаче аргумента делегата.The parameter type of the delegate (Derived) is more restrictive than the parameter type of MyMethod (Base), so that it is always safe to pass the argument of the delegate to MyMethod.

  • Тип возвращаемого значения MyMethod (Derived) является более строгой, чем тип параметра делегата (Base), чтобы всегда быть уверенным в том, чтобы привести возвращаемый тип метода к возвращаемому типу делегата.The return type of MyMethod (Derived) is more restrictive than the parameter type of the delegate (Base), so that it is always safe to cast the return type of the method to the return type of the delegate.

В примере кода выходные данные не создаются.The code example produces no output.

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());
}
using System;
using System.Reflection;

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

public 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 new Derived();
    }
}

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

class Test
{
    public static void Main()
    {
        // The binding flags needed to retrieve MyMethod.
        BindingFlags flags = BindingFlags.Public | BindingFlags.Static;

        // Get a MethodInfo that represents MyMethod.
        MethodInfo minfo = typeof(Derived).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(typeof(Example), minfo);

        // Execute MyMethod using the delegate Example.
        //        
        Base b = ex(new Derived());
    }
}
Imports System.Reflection

' Define two classes to use in the demonstration, a base class and 
' a class that derives from it.
'
Public Class Base
End Class

Public Class Derived
    Inherits Base

    ' Define a Shared 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 Shared Function MyMethod(ByVal arg As Base) As Derived
        Dim dummy As Base = arg
        Return New Derived()
    End Function

End Class

' Define a delegate that takes an instance of Derived and returns an
' instance of Base.
'
Public Delegate Function Example(ByVal arg As Derived) As Base

Module Test

    Sub Main()

        ' The binding flags needed to retrieve MyMethod.
        Dim flags As BindingFlags = _
            BindingFlags.Public Or BindingFlags.Static

        ' Get a MethodInfo that represents MyMethod.
        Dim minfo As MethodInfo = _
            GetType(Derived).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). 
        '
        Dim ex As Example = CType( _
            [Delegate].CreateDelegate(GetType(Example), minfo), _
            Example _
        )

        ' Execute MyMethod using the delegate Example.
        '        
        Dim b As Base = ex(New Derived())
    End Sub
End Module

Комментарии

В .NET Framework версии 1,0 и 1,1 Эта перегрузка метода создает делегаты только для статических методов.In the .NET Framework version 1.0 and 1.1, this method overload creates delegates for static methods only. В .NET Framework версии 2,0 Эта перегрузка метода также может создавать делегаты методов открытого экземпляра. Это значит, что делегаты явно предоставляют скрытый первый аргумент методов экземпляра.In the .NET Framework version 2.0, this method overload also can create open instance method delegates; that is, delegates that explicitly supply the hidden first argument of instance methods. Подробное описание см. в разделе более общий CreateDelegate(Type, Object, MethodInfo) перегруженный метод, который позволяет создавать все сочетания открытых или закрытых делегатов для экземпляров или статических методов, а также при необходимости указывать первый аргумент.For a detailed explanation, see the more general CreateDelegate(Type, Object, MethodInfo) method overload, which allows you to create all combinations of open or closed delegates for instance or static methods, and optionally to specify a first argument.

Примечание

Этот перегруженный метод следует использовать, когда делегат не закрыт по первому аргументу, так как в этом случае он выполняется несколько быстрее.This method overload should be used when the delegate is not closed over its first argument, because it is somewhat faster in that case.

Перегрузка этого метода эквивалентна вызову CreateDelegate(Type, MethodInfo, Boolean) перегрузки метода и указанию true для throwOnBindFailure.This method overload is equivalent to calling the CreateDelegate(Type, MethodInfo, Boolean) method overload and specifying true for throwOnBindFailure.

Примечание

Начиная с .NET Framework 2.0 с пакетом обновления 1 (SP1).NET Framework 2.0 Service Pack 1, этот метод можно использовать для доступа к закрытым методам, если вызывающему объекту был предоставлен ReflectionPermission ReflectionPermissionFlag.RestrictedMemberAccess флаг, и если набор разрешений неоткрытых методов ограничен набором предоставления вызывающего объекта или подмножеством сочетани.Starting with the .NET Framework 2.0 с пакетом обновления 1 (SP1).NET Framework 2.0 Service Pack 1, this method can be used to access non-public methods if the caller has been granted ReflectionPermission with the ReflectionPermissionFlag.RestrictedMemberAccess flag and if the grant set of the non-public methods is restricted to the caller's grant set, or a subset thereof. (См. раздел вопросы безопасности для отражения.)(See Security Considerations for Reflection.)

Для применения этих функциональных возможностей приложение должно использовать .NET Framework 3,5.NET Framework 3.5 или более поздние версии.To use this functionality, your application should target the .NET Framework 3,5.NET Framework 3.5 or later.

Совместимые типы параметров и возвращаемый типCompatible Parameter Types and Return Type

В .NET Framework версии 2,0 типы параметров и тип возвращаемого значения делегата, созданного с помощью этой перегрузки метода, должны быть совместимы с типами параметров и типом возвращаемого значения метода, который представляет делегат. типы не обязательно должны точно совпадать.In the .NET Framework version 2.0, the parameter types and return type of a delegate created using this method overload must be compatible with the parameter types and return type of the method the delegate represents; the types do not have to match exactly. Это представляет ослабление поведения привязки в .NET Framework версии 1,0 и 1,1, где типы должны точно совпадать.This represents a relaxation of the binding behavior in the .NET Framework version 1.0 and 1.1, where the types must match exactly.

Если тип параметра делегата является более строгим, чем тип параметра метода, то параметр делегата совместим с соответствующим параметром метода, так как это гарантирует, что аргумент, переданный делегату, может быть безопасно передан методу.A parameter of a delegate is compatible with the corresponding parameter of a method if the type of the delegate parameter is more restrictive than the type of the method parameter, because this guarantees that an argument passed to the delegate can be passed safely to the method.

Аналогичным образом, тип возвращаемого значения делегата совместим с типом возвращаемого значения метода, если тип возвращаемого значения метода является более строгим, чем тип возвращаемого значения делегата, так как это гарантирует, что возвращаемое значение метода может быть безопасно приведено к типу возвращаемого значения делегата.Similarly, the return type of a delegate is compatible with the return type of a method if the return type of the method is more restrictive than the return type of the delegate, because this guarantees that the return value of the method can be cast safely to the return type of the delegate.

Например, делегат Hashtable с параметром типа и Object типом возвращаемого значения может представлять метод с параметром типа Object и возвращаемым значением типа Hashtable.For example, a delegate with a parameter of type Hashtable and a return type of Object can represent a method with a parameter of type Object and a return value of type Hashtable.

Безопасность

ReflectionPermission
При вызове поздней привязки с помощью таких механизмов InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]), как.when invoked late-bound through mechanisms such as InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]). Связанное перечисление: MemberAccess.Associated enumeration: MemberAccess.

Дополнительно

Применяется к