zoukankan      html  css  js  c++  java
  • 使用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 });
    }


    }
    }
  • 相关阅读:
    自制游戏Zombie代码
    HNOI2020总结
    20200615题解:继续扮演
    20200611题解:树网的核
    历次考试总结
    寒假总结和省选大体规划
    每日总结
    有一种感动叫ACM(记WJMZBMR在成都赛区开幕式上的讲话)
    递推求欧拉函数的最简单的详解
    总结一些好用的C++小技巧
  • 原文地址:https://www.cnblogs.com/evlon/p/1623053.html
Copyright © 2011-2022 走看看