0

指定された型の配列を返すジェネリックメソッドをC#で作成しようとしています。これは私の方法が現在どのように見えるかです:

private T[] GetKeys<T>(string key, Dictionary<string, object> obj) where T : new()
{
    if (obj.ContainsKey(key))
    {
        object[] objs = (object[])obj[key];
        T[] list = new T[objs.Length];
        for (int i = 0; i < objs.Length; i++)
        {
            list[i] = (T)Activator.CreateInstance(
                             typeof(T),
                             new object[] {
                                 (Dictionary<string, object>)objs[i] 
                             });
        }
        return list;
    }
    else
    {
        return null;
    }
}

このクラスは内部で使用され、ライブラリを使用しても利用できないため、どのクラスがに配置されるかはすでにわかっています<T>。すべてのクラスは、コンストラクターで同じパラメーターを持っています。しかし、このコードをコンパイルする前に、パラメーターのないパブリックコンストラクターを提供する必要がありました。今、私がそのActivator.CreateInstance行に着くと、「。」というエラーが表示されますConstructor on type 'MyNamespace.MyClass+MyOtherClass' not foundMyClass上記のメソッドを含むクラスです。MyOtherClassとして渡されるクラスですT

どんな助けでもありがたいですありがとう!

4

3 に答える 3

2

コンストラクターが次のようになっている限り、これは機能するはずです。

public MyType (Dictionary<string,object> dict)
{
}

コンストラクターが非公開の場合は、GetConstructorを変更してBindingFlags.NonPublicを渡す必要があります。

        private T[] GetKeys<T>(string key, Dictionary<string, object> obj)
        // Since you're not using the default constructor don't need this:
        //   where T : new()
        {
            if (obj.ContainsKey(key))
            {
                object[] objs = (object[])obj[key];
                T[] list = new T[objs.Length];
                for (int i = 0; i < objs.Length; i++)
                {
                    list[i] = (T)typeof(T).GetConstructor(new [] {typeof(Dictionary<string,object>)}).Invoke (new object[] {
                                         (Dictionary<string, object>)objs[i] 
                                     });
                }
                return list;
            }
            else
            {
                return null;
            }
        }
于 2011-07-15T02:42:21.167 に答える
1

GetKeys <T>では、Tにパブリックパラメーターなしのコンストラクターが必要です。

private T[] GetKeys<T>(...) where T : new()
                                       ↑

これはTに制約されているため、メソッド本体に次のようなコードを記述できます。

T t = new T();

これは使用していませんが、特定の他のコンストラクター(パブリックパラメーターレスコンストラクターのように強制することはできません)を期待しているため、制約を削除するだけで機能するはずです。

于 2011-07-15T02:42:17.793 に答える
0

このメソッドのためにクラスに類似性を構築しているので、それらすべてに同じインターフェースを拡張させる(または、アプリケーションに適切なものであれば、同じ基本クラスを継承する)のがおそらく最善でしょう。次に、渡したコンストラクターパラメータを使用して、基本クラスのリストを作成する必要があります。次に、呼び出しコードで、必要に応じてリストアイテムをキャストできます。

于 2011-07-15T02:42:54.703 に答える