C# 使用枚举而不是开关来获取相应的类

C# 使用枚举而不是开关来获取相应的类,c#,enums,switch-statement,C#,Enums,Switch Statement,我有两个类,即classA和classB,它们都继承自class1 现在我想发送一个类似“a”的字符串,基于这个字符串,我应该实例化类a 我的老板让我用enum而不是用switch-case来写代码 我该怎么写呢。我猜你的老板是在要求你在switch语句中使用enum: MyClassEnum classToCreate = MyClassEnum.ClassA; switch(classToCreate) { case MyClassEnum.ClassA: retur

我有两个类,即
classA
classB
,它们都继承自
class1

现在我想发送一个类似“a”的字符串,基于这个字符串,我应该实例化类a

我的老板让我用
enum
而不是用switch-case来写代码


我该怎么写呢。

我猜你的老板是在要求你在switch语句中使用enum:

MyClassEnum classToCreate = MyClassEnum.ClassA;
switch(classToCreate)
{
    case MyClassEnum.ClassA:
        return new ClassA();
    case MyClassEnum.ClassB:
        return new ClassB();
}
如果您包括测试和创建对象的代码部分,我们可能会提供更多指导。

试试看

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

您可以创建一个查找工厂

_map = new Dictionary<Option, Func<Class1>>();

_map.Add(Option.A, () => new ClassA());
_map.Add(Option.B, () => new ClassB());
\u map=newdictionary();
_Add(Option.A,()=>newclassa());
_Add(Option.B,()=>newclassb());
然后在下定决心得到正确的类时

public Class1 Resolve(Option option)
{
   Func<Class1> result;
   if(_map.TryGetValue(option, out result))
      return result();
   else
      return null;

}
public Class1解析(选项)
{
Func结果;
if(_map.TryGetValue(选项,输出结果))
返回结果();
其他的
返回null;
}

如果您想避免切换,您可以随时保留某种类型的查找,例如以下内容之一:

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();
    }
}
使用系统;
使用System.Collections.Generic;
类Class1{}
类别A:Class1{}
B类:Class1{}
班级计划
{
专用静态只读字典\u类型映射=
新词典
{
{“A”,类型(类别A)},
{“B”,typeof(ClassB)},
};
专用静态只读字典_funcMap=
新词典
{
{“A”,()=>newclassa()},
{“B”,()=>newclassb()},
};
Class1 CreateViaTypeMap(字符串类型名)
{
变量类型=_typeMap[typeName];
将Activator.CreateInstance(类型)返回为Class1;
}
Class1 CreateViaFuncMap(字符串类型名称)
{
var func=_funcMap[typeName];
返回func();
}
}

您的上司是否希望您使用枚举代替字符串来选择要实例化的类型?枚举选项{a=new classA(),B=new classB()}string v=“a”;新选项。获取(v);我不能这样写吗?FWIW,大多数IoC容器(以及P&P公共服务定位器)都支持带有密钥的GetInstance,因此,尽管对于单个工厂来说这可能有些过分,但这可能值得处理IoC容器?枚举选项{A=new classA(),B=new classB()}string v=“A”;新选项。获取(v);我不能写这样的东西吗?我的老板刚刚说“不要使用开关”,所以我想我根本不能使用它。不幸的是Enum不能按你的要求做。你可能需要向你的老板寻求澄清。有各种各样的解决方案,但没有一种比交换机性能更好,而且大多数都会给将来查看代码的人带来问题。很容易理解switch.enum选项{A=new classA(),B=new classB()}string v=“A”的意图;新选项。获取(v);我不能写这样的东西吗?我的老板刚说“不要用开关”,所以我想我根本不能用它。不用担心。。。很高兴我能帮忙