使用 switch 声明不同类型的变量

Declare different type of variables using switch

我正在尝试根据从函数接收到的特定值创建一个新变量。

变量可以是不同的类。

这是我正在尝试的:

switch (request)
{
    case "ClassA":
        {
            var x = new ClassA();
            break;
        }
    case "ClassB":
        {
            var x = new ClassB();
            break;
        } 
    case "ClassC":
        {
            var x = new ClassC();
            break;
        } 
    case "ClassD":
        {
            var x = new ClassD();
            break;
        }
    default:
        break;
}

到目前为止一切正常,没有问题。当我尝试在 switch 语句的范围之外使用 x 的值时,问题就出现了。系统说 x 在当前上下文中不存在。

有什么办法可以实现吗?

您必须在 switch 之外声明 x。并且只声明一次。如果 类 没有相同的父级,则必须使用 dynamic 作为 x.

的类型
ParentClass x = null;// dynamic x = null; in case that x is not known type
switch (request)
        {
            case "ClassA":
                {
                    x = new ClassA();
                    break;
                }
            case "ClassB":
                {
                    x = new ClassB();
                    break;
                } 
            case "ClassC":
                {
                    x = new ClassC();
                    break;
                } 
            case "ClassD":
                {
                    x = new ClassD();
                    break;
                }
            default:
                break;
        }

这看起来是 interfaceabstract class 的好地方。

基本上,要最轻松地解决您的问题,您可以按如下方式实施 interface

interface IDescriptiveName
{
    DescriptiveNameType Type { get; }
}

enum DescriptiveNameType
{
    ClassA
}

每个 class 然后将实现 DescriptiveNameType Type 和 return 它们的类型。 (通常 DescriptiveNameType 是一个 enum。)即

public class ClassA : IDescriptiveName
{
    public DescriptiveNameType Type { get { return DescriptiveNameType.ClassA; } }
}

然后,根据 ClassA.Type 的值(对于 ClassA 将是 ClassA),您可以转换 x 并使用它。

IDescriptiveName x = null;

// original switch logic simply remove var

if (x.Type == DescriptiveNameType.ClassA)
{
    // do something for ClassA
}

不使用 switch 语句,而是使用 Dictionary 来提供 class 查找:

private readonly Dictionary<string, Func<object>> classLookup = 
    new Dictionary<string, Func<object>>
{
    { "ClassA", () => new ClassA() },
    { "ClassB", () => new ClassB() },
    { "ClassC", () => new ClassC() },
    { "ClassD", () => new ClassD() }
};

public object GetObject(string className)
{
    return classLookup.ContainsKey(className)
        ? classLookup[className]()
        : null;
}