在谷歌搜索并登陆 SO 并阅读了另一个问题之后
如果您在编译时不知道参数的数量或类型,是否可以从 MethodInfo 构建正确的委托?
更多信息:不使用 Reflection.Emit 或 type builder 可以优雅地完成吗?
这对我来说有点可惜,因为 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 方法的调用将有助于大大加快工作速度。
我不能在这里发布代码,所以这是摘要。