代码之家  ›  专栏  ›  技术社区  ›  amazedsaint

将B(C(),D())转换为(C,D)=>B(()=>C(),()=>D())-从MethodInfos生成委托包装?

  •  1
  • amazedsaint  · 技术社区  · 14 年前

    最终,我期待着一种基于反射的方法来为方法B(C(),D())创建委托包装器——比如(C,D)=>B(()=>c(),()=>d())

    第一个问题——假设您有一个Methodinfo,那么创建与该方法签名相对应的委托类型(通过反射)需要考虑哪些因素?

    您是否引用了任何开源项目的代码块P

    更新: 下面是为methodinfo创建委托的一般方法 Builds a Delegate from MethodInfo? -我认为递归地包装参数部分是我周末必须解决的问题。

    2 回复  |  直到 7 年前
        1
  •  0
  •   Cheng Chen    14 年前

    使用 Expression 建立动态方法。根据你的问题,这里有一个例子。我要带走 Console.Write(string s) 举个例子。

        MethodInfo method = typeof(Console).GetMethod("Write", new Type[] { typeof(string) });
        ParameterExpression parameter = Expression.Parameter(typeof(string),"str");
        MethodCallExpression methodExp = Expression.Call(method,parameter);
        LambdaExpression callExp = Expression.Lambda(methodExp, parameter);
        callExp.Compile().DynamicInvoke("hello world");
    
        2
  •  0
  •   Guffa    14 年前

    我成功地从以下方法的MethodInfo创建了一个工作委托:

    方法和委托:

    public static int B(Func<int> c, Func<int> d) {
      return c() + d();
    }
    
    public delegate int TwoFunc(Func<int> c, Func<int> d);
    

    代码:

    MethodInfo m = typeof(Program).GetMethod("B");
    TwoFunc d = Delegate.CreateDelegate(typeof(TwoFunc), m) as TwoFunc;
    int x = d(() => 1, () => 2);
    Console.WriteLine(x);
    

    输出:

    3
    

    但不确定它有多有用。。。