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

时间:2015-06-09 21:02:40

标签: c# variables switch-statement

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

变量可以是不同的类。

这是我正在尝试的内容:

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

有没有办法实现这个目标?

3 个答案:

答案 0 :(得分:6)

您必须在x之外声明switch。并且只宣告一次。如果类没有相同的父级,则必须使用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;
        }

答案 1 :(得分:4)

这似乎是interfaceabstract class的好地方。

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

interface IDescriptiveName
{
    DescriptiveNameType Type { get; }
}

enum DescriptiveNameType
{
    ClassA
}

然后每个类都会实现DescriptiveNameType Type并返回其类型。 (通常DescriptiveNameTypeenum。)I.e。

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

然后,根据ClassA.TypeClassAClassA)的值,您可以投射x并使用它。

IDescriptiveName x = null;

// original switch logic simply remove var

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

答案 2 :(得分:2)

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

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