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 から派生しているため、このメソッドは任意の型の任意のインスタンスで呼び出すことができます。
次に、この方法を使用します。
object dict = dictionaryType.CreateInstance(); // The method CreateInstance() is also an extension
dict.InvokeInstanceMethod("Add", key, val);