私は 2 つのクラス、つまりclassA
とclassB
を継承していclass1
ます。
クラスAをインスタンス化する必要があることに基づいて、「A」のような文字列を送信したい
私の上司はenum
、コードを書くためにスイッチケースを使用する代わりに使用するように私に頼みました.
これを書いてどうするんだよ。
私は 2 つのクラス、つまりclassA
とclassB
を継承していclass1
ます。
クラスAをインスタンス化する必要があることに基づいて、「A」のような文字列を送信したい
私の上司はenum
、コードを書くためにスイッチケースを使用する代わりに使用するように私に頼みました.
これを書いてどうするんだよ。
ルックアップファクトリを作成できます
_map = new Dictionary<Option, Func<Class1>>();
_map.Add(Option.A, () => new ClassA());
_map.Add(Option.B, () => new ClassB());
次に、正しいクラスを取得するための解決策
public Class1 Resolve(Option option)
{
Func<Class1> result;
if(_map.TryGetValue(option, out result))
return result();
else
return null;
}
あなたの上司は、switch ステートメント内で列挙型を使用するように求めていると思います。
MyClassEnum classToCreate = MyClassEnum.ClassA;
switch(classToCreate)
{
case MyClassEnum.ClassA:
return new ClassA();
case MyClassEnum.ClassB:
return new ClassB();
}
テストを実行してオブジェクトを作成するコードのセクションを含めると、おそらくより多くのガイダンスを提供できます。
切り替えを避けたい場合は、次のいずれかのような、ある種のルックアップを常に保持できます。
using System;
using System.Collections.Generic;
class Class1 { }
class ClassA : Class1 { }
class ClassB : Class1 { }
class Program
{
private static readonly Dictionary<string, Type> _typeMap =
new Dictionary<string, Type>
{
{ "A", typeof(ClassA) },
{ "B", typeof(ClassB) },
};
private static readonly Dictionary<string, Func<Class1>> _funcMap =
new Dictionary<string, Func<Class1>>
{
{ "A", () => new ClassA() },
{ "B", () => new ClassB() },
};
Class1 CreateViaTypeMap(string typeName)
{
var type = _typeMap[typeName];
return Activator.CreateInstance(type) as Class1;
}
Class1 CreateViaFuncMap(string typeName)
{
var func = _funcMap[typeName];
return func();
}
}
試す
public class Class1
{
public enum class1: {classA, classB}
public static Class1 Make(class1 which)
{
switch (which)
{
case classA: return new ClassA();
case classB: return new ClassB();
default: return null;
}
}
}
public class ClassA: Class1 {}
public class ClassA: Class1 {}