信息
您所需的主题如下所示。但此主题未包含在此库中。

DynamicMethod 构造函数 (String, Type, Type[])

2013/12/13

创建匿名承载的动态方法,指定方法名称、返回类型和参数类型。

Namespace:  System.Reflection.Emit
程序集:  mscorlib(位于 mscorlib.dll 中)

public DynamicMethod(
	string name,
	Type returnType,
	Type[] parameterTypes
)

参数

name
类型: System.String
动态方法的名称。可以是长度为零的字符串,但不能为 null
returnType
类型: System.Type
一个 Type 对象,它指定动态方法的返回类型;如果方法没有返回类型,则为 null
parameterTypes
类型: System.Type []
一个 Type 对象数组,它指定动态方法的参数的类型;如果方法没有参数,则为 null

异常条件
ArgumentException

parameterTypes 的一个元素为 nullVoid

ArgumentNullException

namenull

NotSupportedException

returnTypeType.IsByRef 返回 true 的类型。

此构造函数创建的动态方法与匿名程序集关联,而不与现有类型或模块关联。在 Windows Phone 应用程序中,动态方法不能与现有的类型或模块相关联。匿名程序集的存在只是为动态方法提供沙盒环境,即将其与其他代码隔离。

将对动态方法的 Microsoft 中间语言 (MSIL) 强制执行实时 (JIT) 可见性检查。也就是说,动态方法中的代码可以访问公共类的公共方法。如果该方法尝试访问 privateprotectedinternal(在 Visual Basic 中为 Friend)类型或成员,则将引发异常。

此构造函数指定方法特性 MethodAttributes.PublicMethodAttributes.Static,以及调用约定 CallingConventions.Standard

下面的示例演示如何使用此构造函数发出和执行简单的动态方法。该方法有两个参数:一个格式字符串和一个整数。该方法使用这两个参数来调用 String.Format(String, Object) 方法重载,并返回结果。

说明注意:

要运行此示例,请参见生成具有静态 Windows Phone TextBlock 控件的示例


using System.Reflection.Emit;
using System.Reflection;
using System;

public class Example
{
   // Declare a delegate that can be used to execute the dynamic method.
   private delegate string Caller(string msg, int number);

   public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      // Create an array that specifies the types of the parameters
      // of the dynamic method. This method has a String parameter
      // and an Integer parameter.
      Type[] paramTypes = { typeof(string), typeof(int) };

      // Create an unnamed dynamic method with a return type of
      // Integer and with two parameters whose types are specified by
      // the array paramTypes. The dynamic method is anonymously
      // hosted. 
      DynamicMethod method = new DynamicMethod("", typeof(string), paramTypes);

      // Get a MethodInfo for the overload of String.Format that
      // takes a format string and an object for insertion in the format 
      // string. The dynamic method uses this overload to format the 
      // return string.
      MethodInfo stringFormat = typeof(string).GetMethod("Format", 
         new Type[] { typeof(string), typeof(object) });

      // Get an ILGenerator and emit a body for the dynamic method.
      ILGenerator il = method.GetILGenerator();

      // Load the arguments onto the execution stack. The second 
      // argument is an Integer, so it must be boxed before it can be 
      // passed to a parameter of type Object. 
      il.Emit(OpCodes.Ldarg_0);
      il.Emit(OpCodes.Ldarg_1);
      il.Emit(OpCodes.Box, typeof(int));

      // Call the String.Format method. The return value from that call 
      // is placed on the execution stack, so the dynamic method simply 
      // returns.         
      il.Emit(OpCodes.Call, stringFormat);
      il.Emit(OpCodes.Ret);

      // Create a delegate that represents the dynamic method. This
      // action completes the dynamic method, and any further attempts
      // to change the method have no effect.
      Caller callMethod = (Caller) method.CreateDelegate(typeof(Caller));

      // Invoke the delegate and display the result.
      string ret = callMethod("The second argument is: {0}.", 1969);

      outputBlock.Text += 
         String.Format("Invoking the delegate returned the string '{0}'.", ret);
   }
}

/* This code example produces the following output:

Invoking the delegate returned the string 'The second argument is: 1969.'.
 */


Windows Phone OS

受以下版本支持: 8.0, 7.1

Windows Phone

显示: