如何从 MethodInfo 创建 Action 委托?

Posted

技术标签:

【中文标题】如何从 MethodInfo 创建 Action 委托?【英文标题】:How can I create an Action delegate from MethodInfo? 【发布时间】:2011-03-02 14:00:56 【问题描述】:

我想从 MethodInfo 对象中获取操作委托。这可能吗?

【问题讨论】:

【参考方案1】:

使用Delegate.CreateDelegate:

// Static method
Action action = (Action) Delegate.CreateDelegate(typeof(Action), method);

// Instance method (on "target")
Action action = (Action) Delegate.CreateDelegate(typeof(Action), target, method);

对于Action<T> 等,只需在各处指定适当的委托类型即可。

在 .NET Core 中,Delegate.CreateDelegate 不存在,但 MethodInfo.CreateDelegate 存在:

// Static method
Action action = (Action) method.CreateDelegate(typeof(Action));

// Instance method (on "target")
Action action = (Action) method.CreateDelegate(typeof(Action), target);

【讨论】:

赞成。如何将此应用于 DataEventArgs ? ***.com/questions/33376326/… Delegate.CreateDelegate 在 .Net Core 中似乎不可用。有什么想法吗? @IAbstract:有趣-我没有发现。您可以致电 MethodInfo.CreateDelegate。 (刚刚试了一下,效果很好。) @JonSkeet:是的,实际上发现并感谢添加答案。 +1 完整性!!! @IAbstract:这听起来很奇怪。可能会在一个新问题中提出这个问题?【参考方案2】:

这似乎也符合 John 的建议:

public static class GenericDelegateFactory

    public static object CreateDelegateByParameter(Type parameterType, object target, MethodInfo method) 

        var createDelegate = typeof(GenericDelegateFactory).GetMethod("CreateDelegate")
            .MakeGenericMethod(parameterType);

        var del = createDelegate.Invoke(null, new object[]  target, method );

        return del;
    

    public static Action<TEvent> CreateDelegate<TEvent>(object target, MethodInfo method)
    
        var del = (Action<TEvent>)Delegate.CreateDelegate(typeof(Action<TEvent>), target, method);

        return del;
    

【讨论】:

以上是关于如何从 MethodInfo 创建 Action 委托?的主要内容,如果未能解决你的问题,请参考以下文章

为任何方法创建 Func 或 Action(在 c# 中使用反射)

如何获取 Java 8 方法参考的 MethodInfo?

MethodInfo 用于 EntityCollection 而不是 Queryable

MethodInfo.Invoke 与 Type.InvokeMember?

命令绑定无法将“System.Reflection.RuntimeEventInfo”类型的对象转换为“System.Reflection.MethodInfo”类型

文本框绑定无法将“System.Reflection.RuntimeEventInfo”类型的对象转换为“System.Reflection.MethodInfo”类型