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


    }
    }
  • 相关阅读:
    [CF845G]Shortest Path Problem?
    [洛谷P4149][IOI2011]Race
    [洛谷P4178]Tree
    [AtCoder AGC27A]Candy Distribution Again
    [洛谷P3806]【模板】点分治1
    [洛谷P2634][国家集训队]聪聪可可
    [CF280C]Game on Tree
    [洛谷P3338][ZJOI2014]力
    [CF438D]The Child and Sequence
    [CF609E]Minimum spanning tree for each edge
  • 原文地址:https://www.cnblogs.com/evlon/p/1623053.html
Copyright © 2011-2022 走看看