1

私は少し複雑に見えるかもしれませんが、私の状況では非常に役立つだろう何かを達成しようとしています、このようなものに見えます。

    public class CommonBaseClass {}
    public class Type1Object : CommonBaseClass {}
    public class Type2Object : CommonBaseClass {}
    public class Type3Object : CommonBaseClass {}

    public static Dictionary<string, Type> DataTypes = new Dictionary<string, Type>()
    {
        { "type1" , typeof(Type1Object) },
        { "type2" , typeof(Type2Object) },
        { "type3" , typeof(Type3Object) }
    };

    public static CommonBaseClass GetGenericObject(string type)
    {
        return new DataTypes[type]();     //How to instantiate generic class?
    }

すべてのコンストラクターが同じ署名を持っていることを保証できるので、これが機能することはわかっていますが、コンパイラーに通知する方法がわかりません。

前もって感謝します

4

3 に答える 3

6

ここにはジェネリックは実際には表示されませんが、次のようになります。

return (CommonBaseClass) Activator.CreateInstance(DataTypes[type]);

パラメーター化されたコンストラクターを使用する必要がある場合は、の代替オーバーロードを使用してくださいActivator.CreateInstance

または、辞書を代理人用に変更することを検討してください。

private static Dictionary<string, Func<CommonBaseClass>> DataTypes =
    new Dictionary<string, Func<CommonBaseClass>>
    {
        { "type1", () => new Type1Object() }
        { "type2", () => new Type2Object() },
        { "type3", () => new Type3Object() }
    };

public static CommonBaseClass GetGenericObject(string type)
{
    return DataTypes[type]();
}
于 2012-06-22T18:04:11.810 に答える
4

これを試して:

public class Foo
{
   public static CommonBaseClass GetGenericObject<T>() where T : CommonBaseClass
   {
      return (CommonBaseClass)Activator.CreateInstance<T>();
   }

   public void Test()
   {
      CommonBaseClass b = GetGenericObject<Type1Object>();
   }
}

ジェネリックスを使用すると、型マッピングの辞書を使用するよりもはるかにうまくこの問題を解決できます。

于 2012-06-22T18:05:50.017 に答える
2

小さなテストアプリケーション:

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            var dataTypes = new Dictionary<string, Type>
            {
                {"type1", typeof (Type1Object)},
                {"type2", typeof (Type2Object)},
                {"type3", typeof (Type3Object)}
            };

            Func<string, CommonBaseClass> GetGenericObject = t =>
            {
                return (CommonBaseClass)Activator.CreateInstance(dataTypes[t]);
            };

            var myGenericObject = GetGenericObject("type1");
        }
    }

    public class CommonBaseClass { }
    public class Type1Object : CommonBaseClass { }
    public class Type2Object : CommonBaseClass { }
    public class Type3Object : CommonBaseClass { }
}
于 2012-06-22T18:06:11.717 に答える