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

发布于 2024-09-28 21:25:26 字数 379 浏览 4 评论 0原文

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

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

您是否有任何这样做的开源项目的代码块的参考? :P

更新: 这是为 methodinfo 创建委托的通用方法 从 MethodInfo 构建委托? - 我认为递归包装参数部分是我周末必须解决的问题。

Ultimately, I'm looking forward to a reflection based approach to create a delegate wrapper for a method B(C(),D()) - to some what like (c,d)=>B(()=>c(),()=>d())

First question - Given that you've a Methodinfo, what are the considerations to create a delegate type (via reflection) which corresponds to that method signature?

Do you have a reference to the code chunk of any open source projects that does this? :P

Update: Here is a generic way to create a delegate for a methodinfo Builds a Delegate from MethodInfo? - I think recursively wrapping the parameters part is something I've to work out over the weekend.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

贵在坚持 2024-10-05 21:25:26

使用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");

Use Expression to build dynamic methods. Here is an example according to your question. I'm taking Console.Write(string s) as an example.

    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");
倒数 2024-10-05 21:25:26

我设法从方法的 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

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

I managed to create a working delegate from the MethodInfo of a method like this:

Method and delegate:

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

public delegate int TwoFunc(Func<int> c, Func<int> d);

Code:

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

Output:

3

Not sure how useful it is, though...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文