【发布时间】:2009-07-14 10:28:01
【问题描述】:
谷歌搜索并登陆 SO 并阅读 this other question
是否可以从 MethodInfo 构建正确的委托如果您在编译时不知道参数的数量或类型?
更多信息:不使用 Reflection.Emit 或类型生成器可以优雅地完成这项工作吗?
这对我来说有点令人沮丧,因为 Delegate.CreateDelegate 要求我将正确的 Delegate 类型指定为第一个参数,否则它会引发异常或调用不正确的方法。
我正在制作一些忍者装备,这对我很有帮助...谢谢!
这是一个通用的解决方案:
/// <summary>
/// Builds a Delegate instance from the supplied MethodInfo object and a target to invoke against.
/// </summary>
public static Delegate ToDelegate(MethodInfo mi, object target)
{
if (mi == null) throw new ArgumentNullException("mi");
Type delegateType;
var typeArgs = mi.GetParameters()
.Select(p => p.ParameterType)
.ToList();
// builds a delegate type
if (mi.ReturnType == typeof(void)) {
delegateType = Expression.GetActionType(typeArgs.ToArray());
} else {
typeArgs.Add(mi.ReturnType);
delegateType = Expression.GetFuncType(typeArgs.ToArray());
}
// creates a binded delegate if target is supplied
var result = (target == null)
? Delegate.CreateDelegate(delegateType, mi)
: Delegate.CreateDelegate(delegateType, target, mi);
return result;
}
注意:我正在构建一个 Silverlight 应用程序,它将取代多年前构建的 javascript 应用程序,在该应用程序中,我有多个调用相同 Silverlight [ScriptableMember] 方法的 Javascript 接口。
需要支持所有这些遗留 JS 接口以及用于访问新功能的新接口,因此自动设置 JS 接口并“委托”对正确 Silverlight 方法的调用将有助于大大加快工作速度。
我不能在这里发布代码,所以这是摘要。
【问题讨论】:
标签: .net reflection delegates methodinfo