星辰.Net技术社区论坛

首页 » .NET » Silverlight » 在Silverlight中使用DynamicMethod(动态方法)
admin - 2008-6-20 14:09:00
DynamicMethod 类(位于System.Reflection.Emit名空间下), 用于定义并表示一种可编译、执行和ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
丢弃的动态方法。 ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    而下面是微软对于DynamicMethod的应用及其运行情况的介绍:ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    可以使用 DynamicMethod 类在运行时生成和执行方法,而不必生成动态程序集和动态类型来包含该方ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
法。回收 DynamicMethod 对象时,由实时 (JIT) 编译器创建的可执行代码也将回收。动态方法是生成和ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
执行少量代码的最有效方式。ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    动态方法在逻辑上与模块或类型关联。如果与模块关联,动态方法对于该模块在全局范围内有效。如果有ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
足够的权限,动态方法可以跳过 JIT 编译器的可见性检查,访问具有该模块所声明类型的私有数据。可以将ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
动态方法与任何模块关联,无论该模块是否由您创建。ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    如果动态方法与类型关联,动态方法可以访问该类型的私有成员。除非动态方法需要访问在同一模块中声ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
明的其他类型的私有数据,否则无需跳过 JIT 可见性检查。可以将动态方法与任何类型关联。ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    下表显示了动态方法与模块关联或与模块中的类型关联时,在进行以及不进行 JIT 可见性检查的情况下,ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
动态方法可以在模块中访问的类型成员。
  ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    动态方法对所关联的模块或包含所关联的类型的模块具有权限。 ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    无需对动态方法及其参数进行命名,但是可以指定名称以协助调试(下文中将会介绍)。动态方法或其属性ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
不支持自定义属性。
    这么一大块看下来,头肯定大了,而本文的例子确很简单,因为DEMO的主要代码全部取自Silverlight2 Beta2ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
CHM, 本人也只是将其中的代码修饰一下并将主要的注释翻译了过来,希望能通过注释让大家明白动态方法到底如ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
何写,如何用.当然因为DynamicMethod这个类的构造方法被重载了六次,而CHM中所介绍的也只是它的基本构造ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
方法, 形如:  ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
DynamicMethod(string name, Type returnType, Type[] parameterTypes);ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    其中:ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    name 就是动态方法的名称,它可为"",但不能是null;ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    returnType 为动态方法的返回值类型;ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    parameterTypes 为参数的类型数组;ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    首先请大家看一下DEMO的运行截图如下:ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    而这个DEMO的主要代码就是Example.cs, 其代码如下(相关内容详见注释):  ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
using System;ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
using System.Reflection;ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
using System.Reflection.Emit;ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
using System.Runtime.InteropServices;ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
public class ExampleÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
{ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
   
// 下面的构造函数和公有属性用于将动态方法绑定到对象实例时使用ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    public int Test;ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
   
public Example(int test)ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    {ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
this.Test = test;ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    }ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
   
// 下面的代理(delegate)用于调用动态方法ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    private delegate long Square(int input);ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
   
private delegate int Bound(int input);ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
   
private delegate int Unbound(Example target, int input);ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
   
/// <summary>ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
   
/// 动态方法简单调用ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
   
/// </summary>ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
   
/// <param name="outputBlock"></param>ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    public static void Demo1(System.Windows.Controls.TextBlock outputBlock)ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    {ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        outputBlock.Text
+= "例子 1 : 动态方法简单调用\n\n";ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 例子 1: 简单的动态方法ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 创建一个动态方法所使用的参数类型数组,因为当前例子中只有一个参数(int 类型),所ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 以数组中将会只有一个类型ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        Type[] methodArgs = { typeof(int) };ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 创建一个动态方法(DynamicMethod)。ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 在这个例子中, 方法名称为SquareIt(平方运算).ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 另外,动态方法名称不是必填项. 因为系统不会按方法名称来调用动态方法(而是采用delegate).ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 还有就是两个动态方法可以使用同一个方法名称.不过,这个方法名称会在调用堆栈(calls stacks)ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 中出现,这样便于进行调试ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
//ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 在这个例中,动态方法的返回类型是Long [如下typeof(long)]. ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        System.Reflection.Emit.DynamicMethod squareIt = new System.Reflection.Emit.DynamicMethod(ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
           
"SquareIt",ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
           
typeof(long),ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
            methodArgsÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        );ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 下面是SquareIt(平方运算)的函数内容.ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 在这个例子中, 使用ILGenerator生成 MSIL(MS中间语言). ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// DynamicMethod has an associated type DynamicILInfo that can be used in conjunction with ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// unmanaged code generators.ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
//ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// MSIL 加载该参数(Integer)到堆栈上 , 并将其转换成为Long 类型. duplicates(复制) 栈顶元素.ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 然后将栈顶的两个元素的乘积(平方运算)压入堆栈(返回结果时使用)ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        ILGenerator il = squareIt.GetILGenerator();ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        il.Emit(OpCodes.Ldarg_0);ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        il.Emit(OpCodes.Conv_I8);ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        il.Emit(OpCodes.Dup);ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        il.Emit(OpCodes.Mul);ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        il.Emit(OpCodes.Ret);ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 为上面的方法创建一个代码并将其绑定到Square的实例上. ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// Creating the delegate completes the method, and any further ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// attempts to change the method (for example, by adding moreÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// MSIL) are ignored. ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
//ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        Square invokeSquareIt =ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
            (Square)squareIt.CreateDelegate(
typeof(Square));ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 下面的代码显示了如使用 Square delegate,ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        outputBlock.Text
+= String.Format("123456789 squared = {0}\n",ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
            invokeSquareIt(
123456789));ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 当然绑定代理也可以使用 Func (能生成带单一参数且有返回类型的泛型代理),如下:ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        Func<int, long> invokeGeneric =ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
            (Func
<int, long>)squareIt.CreateDelegate(typeof(Func<int, long>));ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        outputBlock.Text
+= String.Format("987654321 squared = {0}\n",ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
            invokeGeneric(
987654321));ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    }ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
   
/// <summary>ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
   
/// 对象实例绑定调用ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
   
/// </summary>ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
   
/// <param name="outputBlock"></param>ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    public static void Demo2(System.Windows.Controls.TextBlock outputBlock)ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    {ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        outputBlock.Text
+= "\n例子 2: 对象实例绑定调用\n\n";ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 例子 2: 将动态方法绑定到实例上.ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
//ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 下面语句将会创建一个指定参数类型的数组,以便将其绑定的动态方法上ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 如要将方法(method)代理绑定到对象上,那么第一个参数应匹配代理要绑定的对象类型ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 在下面代码中,要绑定的是Example类型的对象ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        Type[] methodArgs2 = { typeof(Example), typeof(int) };ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 创建动态方法, 在这个例子中, 该(动态)方法没有指定名称(为""), ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 返回值类型为Integer. 这个方法将会访问Example类的公有成员(Test)ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
//ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        System.Reflection.Emit.DynamicMethod multiplyTestField = new System.Reflection.Emit.DynamicMethod(ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
           
"",ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
           
typeof(int),ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
            methodArgs2ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        );ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 在这个例子中, 使用ILGenerator生成 MSIL(MS中间语言). ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
//ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// MSIL 加载第一个参数(Example类的一个实例), 然后使用这个实例来访问公有成员(Test) ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        ILGenerator ilMP = multiplyTestField.GetILGenerator();ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        ilMP.Emit(OpCodes.Ldarg_0);ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        FieldInfo testInfo
= typeof(Example).GetField("Test",ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
            BindingFlags.Public
| BindingFlags.Instance);ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 加载第二个参数, 然后这两个数字会被相乘,如果返回值比INT大,则会执行截取操作,并将结果返回.ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        ilMP.Emit(OpCodes.Ldfld, testInfo);ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        ilMP.Emit(OpCodes.Ldarg_1);ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        ilMP.Emit(OpCodes.Mul);ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        ilMP.Emit(OpCodes.Ret);ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
#region Bound1ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 创建上面动态方法的代理. ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// Creating the delegate completes the method, and any further ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// attempts to change the method  for example, by adding moreÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// MSIL  are ignored. ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 下面代码会将上面的动态方法绑定到Example 类的一个新实例上,同时将该实例的Test属性设置成42.ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 这样每次代理运行时,都会调用同一个Example实例.另外这个代理将不再使用类型Example作为参数,ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 因为Example的实例已绑定到了代理的Target参数上(如下面的((Example)invoke.Target).Test调用)ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 因为下面的方法调用就像是隐藏了方法的第一个参数一样.ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 下面代理被执行了两次,分别使用了不同的参数值(分别为3, 5)ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        Bound invoke = (Bound)multiplyTestField.CreateDelegate(ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
           
typeof(Bound), new Example(42));ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        outputBlock.Text
+= String.Format(ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
           
"Example.Test = {0}; {1} * Example.Test = {2}\n",ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
            ((Example)invoke.Target).Test,
3, invoke(3));ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        outputBlock.Text
+= String.Format(ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
           
"Example.Test = {0}; {1} * Example.Test = {2}\n",ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
            ((Example)invoke.Target).Test,
5, invoke(5));ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
//修改当前实例的Test字段(42*2=84)ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        ((Example)invoke.Target).Test *= 2;ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        outputBlock.Text
+= String.Format(ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
           
"Example.Test = {0}; {1} * Example.Test = {2}\n\n",ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
            ((Example)invoke.Target).Test,
5, invoke(5));ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
#endregionÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
#region Bound2ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 下面的Example实例将会被绑定到一个Bound代理上, 然后这个代理会运行两次,ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 其间对 Example的Test值进行加1操作(类似上面的*2操作)ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        Example ex = new Example(5280);ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        Bound another
=ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
            (Bound)multiplyTestField.CreateDelegate(
typeof(Bound), ex);ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        outputBlock.Text
+= String.Format(ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
           
"Example.Test = {0}; {1} * Example.Test = {2}\n",ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
            ex.Test,
3, another(3));ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        ex.Test
+= 1;ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        outputBlock.Text
+= String.Format(ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
           
"Example.Test = {0}; {1} * Example.Test = {2}\n\n",ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
            ex.Test,
3, another(3));ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
#endregionÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
#region UnboundÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 最后,创建一个类型Unbound的代理.而它有两个参数,一个是Example的实例,另一个是一个Integer型数据.ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
// 下面的代理(Unbound) 将会绑定不带Example实例的方法,实相应的实例参数将会在代理执行过程中进行加载ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        Unbound notBound =ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
            (Unbound)multiplyTestField.CreateDelegate(
typeof(Unbound));ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        outputBlock.Text
+= String.Format("{0} * Example.Test(42) = {1}\n",ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
           
10, notBound(new Example(42), 10));ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        outputBlock.Text
+= String.Format("{0} * Example.Test(56) = {1}\n",ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
           
10, notBound(new Example(56), 10));ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
#endregionÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    }ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
}ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    代码量不是很大,但又学习又翻译却用了一些时间,希望大家见谅:)    ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    当然如下链接是它的一些在线文档:ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    http://msdn.microsoft.com/zh-cn/library/system.reflection.emit.dynamicmethod(VS.85).aspx    ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    http://msdn.microsoft.com/zh-cn/library/exczf7b9(en-us,VS.85).aspx    ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
    http://technet.microsoft.com/zh-cn/sysinternals/system.reflection.emit.dynamicmethod(VS.85).aspxÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢

附件: dynamicmethod.rar
1
查看完整版本: 在Silverlight中使用DynamicMethod(动态方法)