从Action< >'s实例中获取Invoke MethodInfo的最安全的方法

本文关键字:MethodInfo 获取 Invoke 方法 安全 实例 Action | 更新日期: 2023-09-27 18:09:05

我目前正在研究一种扩展方法,可以简化问题标题所暗示的内容。

当然可以。使用GetMetohd("Invoke")方法调用类型并完成它,但有些东西告诉我,这不是"最安全"的方式。类和类型可以改变,包括BCL中的类和类型。

所以我想出了下面的LINQ语句,它工作得很好:
 public static class ActionExtensions
{
    public static MethodInfo GetInvoke<T>(this Action<T> obj)
    {
        var actionType = obj.GetType();
        var tType= typeof(T);
        return (
             from methodInfo
             in actionType.GetMethods()
             let par = methodInfo.GetParameters()
             where par.Length == 1 && par[0].ParameterType == tType
             select methodInfo
             ).FirstOrDefault();
    }
}

问题是,即使这样也感觉有点不确定,因为有一天Action可能会改变并包含另一个具有此类特征的方法。即使我添加了"HasGenericParameters"约束,也不能保证安全性。

你知道如何获得与

相关的确切MethodInfo实例吗?
"Action<T>.Invoke()"

从Action< >'s实例中获取Invoke MethodInfo的最安全的方法

除非我误解了您的意图,否则整个方法似乎是不必要的。您可以获取委托背后的确切方法的MethodInfo,如下所示:

Action<Foo> myAction = //get delegate...
MethodInfo theMethod = myAction.Method;

如果Action<T>被封装在特定实例的方法中,则该实例可以从myAction.Target属性中获得。