2012-05-07 20 views
0

我有兩個類,即classAclassB,它們都從class1繼承。使用enum而不是switch來獲得對應的類

現在我想發送一個字符串像基於我應該實例類A

我的老闆要求我用enum而不是使用開關的情況下寫的代碼「A」。

我該怎麼寫這個。

+0

您的上司是否意味着他希望您使用枚舉代替字符串來選擇要實例化的類型? –

+0

是的,就是這一點。 – Edison

+0

enum option {A = new classA(),B = new classB()} string v =「A」; new option.get(v); 我不能寫這樣的東西嗎? – Edison

回答

1

您可以創建一個查找工廠

_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; 

} 
+0

好的,謝謝你這麼多! – Edison

+0

不用擔心......很高興我能幫上忙 – aqwert

1

我猜你的老闆要求你用switch語句中的枚舉:

MyClassEnum classToCreate = MyClassEnum.ClassA; 
switch(classToCreate) 
{ 
    case MyClassEnum.ClassA: 
     return new ClassA(); 
    case MyClassEnum.ClassB: 
     return new ClassB(); 
} 

如果包含的代碼,做測試和創建的對象的部分,我們或許可以提供更多指導。

+0

enum option {A = new classA(),B = new classB()} string v =「A」; new option.get(v); 我不能寫這樣的東西嗎? 我的老闆剛剛說「不要使用開關」,所以我覺得我根本無法使用它。 – Edison

+0

不幸的是枚舉不能完成你所要求的。你可能需要向你的老闆尋求澄清。對此有各種解決方案,但沒有一個能夠比交換機執行更多(或者更好),並且大多數解決方案都會爲將來查看代碼的任何人帶來問題。很容易理解交換機的意圖。 – TheEvilPenguin

0

嘗試

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 {} 
+0

enum option {A = new classA(),B = new classB()} string v =「A」; new option.get(v); 我不能寫這樣的東西嗎? 我的老闆剛剛說「不要使用開關」,所以我覺得我根本無法使用它。 – Edison

0
,如果你想避免開關

,你可以隨時保持某種形式的查找,如下所示:

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(); 
    } 
} 
相關問題