谷歌搜索和SO登陸並具有後讀this other question從MethodInfo構建一個委託?
是否有可能從一個MethodInfo建立一個正確的代表如果你不知道在編譯時參數的數量和類型?
更多內容:這可以在沒有使用Reflection.Emit或類型構建器的情況下優雅地完成嗎?
這對我來說是件壞事,因爲Delegate.CreateDelegate要求我指定正確的委託類型作爲第一個參數,否則它會拋出異常或調用不正確的方法。
我正在建造一些忍者齒輪,這將有助於很多...謝謝!
這裏有一個通用的解決方案:
/// <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方法的東西將有助於加速工作。
我不能在這裏發佈代碼,所以這是總結。
ah-ha ...對MakeGenericType + Func很好......這樣做:-) – chakrit 2009-07-14 10:36:43
爲了避免你static Type [],請考慮Expression.GetActionType/Expression.GetFuncType - 請參閱post。我希望**能夠將這些方法擴展到包含新的.NET 4.0變體。 – 2009-07-14 10:44:55
我爲問題添加了「爲什麼」 – chakrit 2009-07-14 10:52:09