好的,我终于设法解决了这个问题。
最后我注意到我想做的不是强制转换,
而是调用方法。
也许有比我更好的解决方案。无论如何,我想分享我的解决方案。
首先,为对象创建一个扩展类(虽然这很奇怪):
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 派生的,因此可以在任何类型的任何实例上调用此方法。
然后我使用这个方法:
object dict = dictionaryType.CreateInstance(); // The method CreateInstance() is also an extension
dict.InvokeInstanceMethod("Add", key, val);