System.Delegate.CreateDelegate 方法 (Type, MethodInfo)

方法描述

创建指定类型的委托以表示指定的静态方法。

语法定义(C# System.Delegate.CreateDelegate 方法 (Type, MethodInfo) 的用法)

public static Delegate CreateDelegate(
	Type type,
	MethodInfo method
)

参数/返回值

参数值/返回值 参数类型/返回类型 参数描述/返回描述
type System-Type 要创建的委托的 Type。
method System-Reflection-MethodInfo 描述委托要表示的静态或实例方法的 MethodInfo。.NET Framework 1.0 和 1.1 版中仅支持静态方法。
返回值 System.Delegate 表示指定静态方法的指定类型的委托。

提示和注释

在 .NET Framework 1.0 和 1.1 版中,此方法重载仅为静态方法创建委托。 在 .NET Framework 2.0 版中,此方法重载还可以创建开放的实例方法委托,即显式提供实例方法的第一个隐藏参数的委托。 有关详细说明,请参见更一般的 CreateDelegate(Type, Object, MethodInfo) 方法重载,它允许您为实例或静态方法创建开放或封闭委托的所有组合,并且还可选择指定第一个参数。

注意

当委托不是通过它的第一个参数封闭时,应使用此方法重载,因为在这种情况下速度会更快些。

此方法重载等效于调用 CreateDelegate(Type, MethodInfo, Boolean) 方法重载并为 throwOnBindFailure 指定 true。

注意

从 .NET Framework 2.0 版 Service Pack 1 开始,如果已授予调用方带有 ReflectionPermissionFlag.RestrictedMemberAccess 标志的 ReflectionPermission,并且非公共方法的授予集限制为调用方的授予集或其子集,则此方法可用于访问非公共方法。 (请参见 反射的安全注意事项。)

若要使用此功能,您的应用程序应面向 .NET Framework 3.5 版 或更高版本。

兼容的参数类型和返回类型

在 .NET Framework 2.0 版中,使用此方法重载创建的委托的参数类型和返回类型必须与该委托表示的方法的参数类型和返回类型兼容;但这些类型不必精确匹配。 这表示放宽了对 .NET Framework 1.0 和 1.1 版中的绑定行为的要求,在 .NET Framework 1.0 和 1.1 中类型必须精确匹配。

如果委托参数的类型的限制性强于方法参数的类型,则该委托的参数与该方法的相应参数兼容,因为这可保证传递给委托的参数可以安全地传递给方法。

同样,如果方法的返回类型的限制性强于委托的返回类型,则该委托的返回类型与该方法的返回类型兼容,因为这可保证方法的返回值可以安全地强制转换为委托的返回类型。

例如,具有类型为 Hashtable 的参数和 Object 返回类型的委托可以表示具有类型为 Object 的参数和类型为 Hashtable 的返回值的方法。

System.Delegate.CreateDelegate 方法 (Type, MethodInfo)例子

该代码示例不生成任何输出。

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

异常

异常 异常描述
ArgumentNullException
  • type 为 null。
  • method 为 null。
ArgumentException
  • type 不继承 MulticastDelegate。
  • type 不是 RuntimeType。 请参见反射中的运行时类型。
  • method 不是静态方法,并且 .NET Framework 的版本为 1.0 或 1.1。
  • 不能绑定 method。
  • method 不是 RuntimeMethodInfo。 请参见反射中的运行时类型。
MissingMethodException 未找到 type 的 Invoke 方法。
MethodAccessException 调用方无权访问 method。

命名空间

namespace: System

程序集: mscorlib(在 mscorlib.dll 中)

版本信息

.NET Framework 受以下版本支持:4、3.5、3.0、2.0、1.1、1.0 .NET Framework Client Profile 受以下版本支持:4、3.5 SP1 受以下版本支持:

适用平台

Windows 7, Windows Vista SP1 或更高版本, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008(不支持服务器核心), Windows Server 2008 R2(支持 SP1 或更高版本的服务器核心), Windows Server 2003 SP2 .NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求。