您的位置:首页 > 其它

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

2009-12-13 16:43 549 查看
研究了一下,发现系统已经有这类的函数,晕吧!! 实现一个类似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 });
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: