OK,我設法在最後來解決這個問題。
最後我注意到,我想要做的不是鑄造,
但調用方法。
也許有比我的更好的解決方案。 無論如何,我想分享我的解決方案。
首先,創建一個擴展類對象(這是奇怪,雖然):
public static class ReflectionHelper
{
public static object InvokeInstanceMethod(this object invoker, string methodName, params object[] parameters)
{
MethodInfo[] methods = invoker.GetType().GetMethods();
foreach (MethodInfo method in methods)
{
ParameterInfo[] paramInfos = method.GetParameters();
if (method.Name == methodName && paramInfos.Length == parameters.Length)
{
for (int i = 0; i < parameters.Length; i++)
{
if (!paramInfos[i].ParameterType.IsAssignableFrom(parameters[i].GetType()))
{
throw new MissingMethodException();
}
}
return method.Invoke(invoker, parameters);
}
}
throw new MissingMethodException();
}
}
這種擴展方法可以讓我這樣調用方法:
anyInstance.InvokeInstanceMethod("MethodName", param1, param2, ...);
因爲所有類型,排除對象本身,都是從Object派生的,這個方法可以在任何類型的任何實例上調用。
然後我用這個方法:
object dict = dictionaryType.CreateInstance(); // The method CreateInstance() is also an extension
dict.InvokeInstanceMethod("Add", key, val);
謝謝,基里爾。 但IDictionary也需要通用屬性。 – Aetherus
有非通用的IDictionary –