0

最近、私は自分用の小さなフレームワークを開発しています
が、この問題に遭遇しました:
次のようなことを行うにはどうすればよいですか:

void object CreateDictionary(Type dictionaryType)
{
    object dict = dictionaryType.GetConstructor(new Type[] {}).Invoke(new object[] {});
    // Cast dict to its real type here so that I can add key-value-pairs to it.
    ...
}

dictionaryType は、ある種の Dictionary の型であり、リフレクションを介して取得されます。
実行時までジェネリック属性がわからないため、完全な型についてはわかりません。

宣言object dictvar dictに変更してみましたが、どちらも機能しません。

4

2 に答える 2

1

これはできません。しかし、これは一種の Dictionary であることがわかっているので、IDictionary にキャストして IDictionary のメソッドを使用できます。

object CreateDictionary(Type dictionaryType)
{
    object dict = dictionaryType.GetConstructor(new Type[] {}).Invoke(new object[] {});
    var idictionary = (IDictionary)dict;
    idictionary.Add(key, value);
}

このすべての辞書が 1 つのクラスから継承されている場合は、それをこのクラスにキャストして、このクラスのメソッドを使用できます。

ちなみに、 Type のインスタンスを取得する方が簡単です:

object obj = Activator.CreateInstance(type);
于 2012-10-27T12:49:30.500 に答える
0

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);
于 2012-10-27T12:53:06.347 に答える