我目前正在研究一种扩展方法,可以简化问题标题所暗示的内容。
当然可以。使用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()"
除非我误解了您的意图,否则整个方法似乎是不必要的。您可以获取委托背后的确切方法的MethodInfo,如下所示:
Action<Foo> myAction = //get delegate...
MethodInfo theMethod = myAction.Method;
如果Action<T>
被封装在特定实例的方法中,则该实例可以从myAction.Target
属性中获得。