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

方法描述

使用针对绑定失败的指定行为,创建用于表示指定静态方法的指定类型的委托。

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

public static Delegate CreateDelegate(
	Type type,
	MethodInfo method,
	bool throwOnBindFailure
)

参数/返回值

参数值/返回值 参数类型/返回类型 参数描述/返回描述
type System-Type 要创建的委托的 Type。
method System-Reflection-MethodInfo 描述委托要表示的静态或实例方法的 MethodInfo。
throwOnBindFailure System-Boolean 为 true,表示无法绑定 method 时引发异常;否则为 false。
返回值 System.Delegate 表示指定静态方法的指定类型的委托。

提示和注释

此方法重载可以创建开放的静态方法委托和开放的实例方法委托,即公开实例方法的第一个隐藏参数的委托。 有关详细说明,请参见更一般的 CreateDelegate(Type, Object, MethodInfo, Boolean) 方法重载,它允许您为实例方法或静态方法创建开放或封闭委托的所有组合。

注意

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

注意

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

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

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

委托的参数类型和返回类型必须与委托所表示的方法的参数类型和返回类型兼容;但类型不必精确匹配。

注意

在 .NET Framework 1.0 和 1.1 版中,类型必须精确匹配。

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

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

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

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

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

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,并且 throwOnBindFailure 为 true。
  • method 不是 RuntimeMethodInfo。 请参见反射中的运行时类型。
MissingMethodException 未找到 type 的 Invoke 方法。
MethodAccessException 调用方无权访问 method。

命名空间

namespace: System

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

版本信息

.NET Framework 受以下版本支持:4、3.5、3.0、2.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 系统要求。