使用Emit动态调用方法(技术原型2)

    研究了一下,发现系统已经有这类的函数,晕吧!! 实现一个类似Func和Action的方法吧.
调用示例如下:
object inst = new Program();
decimal ret = inst.Dynamic<Guid, int, decimal>("HelloWorld", Guid.NewGuid(), 2009);
原码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection.Emit;
using System.Reflection;
using Evlon.Util.Dynamic;

namespace ConsoleApplication2008
{
public class Program
{
static void Main(string[] args)
{
object inst = new Program();
decimal ret = inst.Dynamic<Guid, int, decimal>("HelloWorld", Guid.NewGuid(), 2009);
Console.WriteLine(ret);

Console.ReadLine();
}

public decimal HelloWorld(Guid userId, int year)
{
return userId.GetHashCode() + year;
}
}

}
namespace Evlon.Util.Dynamic
{
public static class TypeExtension
{
public static TResult Dynamic<T, TResult>(this object inst, string methodName, T arg)
{
return (TResult)Delegate.CreateDelegate(typeof(Func<T, TResult>), inst, methodName).DynamicInvoke(arg);
}
public static TResult Dynamic<T1, T2, TResult>(this object inst, string methodName, T1 arg1, T2 arg2)
{
return (TResult)Delegate.CreateDelegate(typeof(Func<T1, T2, TResult>), inst, methodName).DynamicInvoke(new object[] { arg1, arg2 });
}
public static TResult Dynamic<T1, T2, T3, TResult>(this object inst, string methodName, T1 arg1, T2 arg2, T3 arg3)
{
return (TResult)Delegate.CreateDelegate(typeof(Func<T1, T2, T3, TResult>), inst, methodName).DynamicInvoke(new object[] { arg1, arg2, arg3 });
}
public static TResult Dynamic<T1, T2, T3,T4, TResult>(this object inst, string methodName, T1 arg1, T2 arg2, T3 arg3,T4 arg4)
{
return (TResult)Delegate.CreateDelegate(typeof(Func<T1, T2, T3, T4, TResult>), inst, methodName).DynamicInvoke(new object[] { arg1, arg2, arg3, arg4 });
}

public static void Dynamic<T>(this object inst, string methodName, T arg)
{
Delegate.CreateDelegate(
typeof(Action<T>), inst, methodName).DynamicInvoke(arg);
}
public static void Dynamic<T1, T2>(this object inst, string methodName, T1 arg1, T2 arg2)
{
Delegate.CreateDelegate(
typeof(Action<T1, T2>), inst, methodName).DynamicInvoke(new object[] { arg1, arg2 });
}
public static void Dynamic<T1, T2, T3>(this object inst, string methodName, T1 arg1, T2 arg2, T3 arg3)
{
Delegate.CreateDelegate(
typeof(Action<T1, T2, T3>), inst, methodName).DynamicInvoke(new object[] { arg1, arg2, arg3 });
}
public static void Dynamic<T1, T2, T3, T4>(this object inst, string methodName, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
{
Delegate.CreateDelegate(
typeof(Action<T1, T2, T3, T4>), inst, methodName).DynamicInvoke(new object[] { arg1, arg2, arg3, arg4 });
}


}
}

 

posted @ 2009-12-13 16:43  阿牛  阅读(807)  评论(0编辑  收藏  举报