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 });
    }


    }
    }
  • 相关阅读:
    生产环境Redis中的热点key如何发现并优化?
    一条update SQL在MySQL中结束生命历程
    主从测试过程中,如何模拟网络抖动?
    RDS-MySQL物理备份文件恢复到自建数据库
    Python从数据库中读取数据,并打印表格展示数据。
    Python简单巡检MySQL
    RDS-MySQL备份文件恢复到自建数据库
    使用Python读取Excel表格
    设计模式六大原则:迪米特法则
    设计模式六大原则:开闭原则
  • 原文地址:https://www.cnblogs.com/evlon/p/1623053.html
Copyright © 2011-2022 走看看