使用 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;
}
这看起来是 interface
或 abstract 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;
}
我正在尝试根据从函数接收到的特定值创建一个新变量。
变量可以是不同的类。
这是我正在尝试的:
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;
}
这看起来是 interface
或 abstract 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;
}