我正在尝试根据从函数接收的特定值创建一个新变量。
变量可以是不同的类。
这是我正在尝试的内容:
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
。
有没有办法实现这个目标?
答案 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)
这似乎是interface
或abstract class
的好地方。
基本上,为了最轻松地解决您的问题,您可以按如下方式实施interface
:
interface IDescriptiveName
{
DescriptiveNameType Type { get; }
}
enum DescriptiveNameType
{
ClassA
}
然后每个类都会实现DescriptiveNameType Type
并返回其类型。 (通常DescriptiveNameType
是enum
。)I.e。
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
}
答案 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;
}