2

現在、私は次のようなコードを持っています:

    static void Main()
    {
        int whichClass = 0;
        if (whichClass == 0)
        {
            //repeat code
            TestAbstract clTest = new ClassA();
            clTest.MainFunc();
        }
        else if (whichClass == 1)
        {
            //repeat code
            TestAbstract clTest = new ClassB();
            clTest.MainFunc();
        }
        else if (whichClass == 10)
        {
            //repeat code
            TestAbstract clTest = new ClassX();
            clTest.MainFunc();
        }
    }

ご覧のとおり、初期化のためにコードを3回記述し、3つの異なるクラスで関数を呼び出す必要があります。

私が欲しいのは、動的クラスで1回だけ呼び出すことです。どうすればそれが可能ですか?

4

7 に答える 7

11

Dictionary<int, Type>またはDictionary<int, Func<TestAbstract>:

var typeMapping = new Dictionary<int, Type>
{
    { 0, typeof(ClassA) },
    { 1, typeof(ClassB) },
    { 10, typeof(ClassX) }
};

...
Type type;
if (typeMapping.TryGetValue(whichClass, out type))
{
    TestAbstract test = (TestAbstract) Activator.CreateInstance(type);
    test.MainFunc();
}

を使用するFunc<TestAbstract>と、インスタンスの作成方法がより柔軟にTestAbstractなり、コンパイル時の型の安全性が向上しますが、より長くなります。

var factoryMapping = new Dictionary<int, Func<TestAbstract>>
{
    { 0, () => new ClassA() },
    { 1, () => new ClassB() },
    { 10, () => new ClassX() }
};

...
Func<TestAbstract> factory;
if (factoryMapping.TryGetValue(whichClass, out factory))
{
    TestAbstract test = factory();
    test.MainFunc();
}

ちなみに、整数値がどこから来ているのかは明確ではありません-そのために列挙型が必要になる場合があります。一体、列挙名は型の名前でさえありえます:

TestClass whichClass = TestClass.ClassA;

...

Type type = Type.GetType("SomeNamespace." + whichClass);
TestAbstract test = (TestAbstract) Activator.CreateInstance(type);
于 2013-01-18T09:05:59.570 に答える
5

渡されたパラメーターに従ってオブジェクトを返す Factory クラスを作成できます。

public static TestAbstractFactory
{
  public static TestAbstract GetTestAbstract(int whichClass)
  { 
      switch(whichClass)
      {
      case 0:
        return new ClassA();
      case 1:
        return new ClassB();
      case 10:
        return new ClassX();
      default: 
        return null;
      }
  }
}
于 2013-01-18T09:06:10.197 に答える
3
static void Main()
{
        int whichClass = 0;
        TestAbstract clTest = null;
        if (whichClass == 0)
            clTest = new ClassA();
        else if (whichClass == 1)
             clTest = new ClassB();
        else if (whichClass == 10)
             clTest = new ClassX();
        if(clTest != null)
             clTest.MainFunc();

}

于 2013-01-18T09:07:17.050 に答える
2

ClassAからCがTestAbstractから派生し、MainFuncがTestAbstractの仮想メソッドであると仮定すると、次のコードを使用できます。

static void Main()
{
    int whichClass = 0; // 0 to 2
    Type type = new[] { typeof(ClassA), typeof(ClassB), typeof(ClassC) } [ whichClass ];        
    TestAbstract clTest = (TestAbstract) Activator.CreateInstance(type);
    clTest.MainFunc();
}
于 2013-01-18T09:08:24.847 に答える
0

リフレクションを使用できます。

string whichClass = "className";
Type t = Type.GetType(whichClass);
TestAbstract o = (TestAbstract)Activator.CreateInstance(t);
o.MainFunc();
于 2013-01-18T09:09:27.823 に答える
0
static void Main()
{
  int whichClass = 0;
  TestAbstract clTest ;
  if (whichClass == 0)
  {
   //repeat code
   clTest = new ClassA();
  }
  else if (whichClass == 1)
  {
   //repeat code
   clTest = new ClassB();
  }
 else if (whichClass == 10)
 {
  //repeat code
   clTest = new ClassX();        
  }

  clTest.MainFunc();
}
于 2013-01-18T09:06:42.660 に答える
0

static void Main()

{
    int whichClass = 0;
    TestAbstract clTest;

    if (whichClass == 0)
    {
        //repeat code
         clTest = new ClassA();
    }
    else if (whichClass == 1)
    {
        //repeat code
        clTest = new ClassB();
    }
    else if (whichClass == 10)
    {
        //repeat code
        clTest = new ClassX();
    }
    if(clTest != null)
        clTest.MainFunc();
}
于 2013-01-18T09:07:48.337 に答える