C# 中的静态类型确定
Static type determination in c#
我确定我只是不知道该怎么称呼它,但我正在尝试在我的代码中进行切换以使我的对象成为两个子类型之一,将它们称为 X_A
和 X_B
,都是 X
的亚型。代码开关是一个常量/静态变量(基本上我希望能够在编译时快速在两种类型的内部数据库之间进行选择)。
我看到 2 个选项:
- 使用 if 语句:
X theObj;
if (theType=="A") theObj = new X_A();
else theObj = new X_B();
- 使用反射(如here)
Type type = typeof(X_A);
X theObj = (X)Activator.CreateInstance(type);
有没有更简洁的方法?一个像 (2) 但有静态类型检查?也许是编译器指令之类的?
(此外,我只是不更改创建对象的一行代码的原因是实际上在我的代码中有几个这样的代码,所以我不会更改每一个..因此偏好(2) 的更好版本。)
如果是在编译时使用 #if
compile-time 指令。
#define USE_A
class Foo
{
X NewX()
{
#if USE_A
return new X_A();
#elif USE_B
return new X_B();
#else
throw new NotSupportedException();
#endif
}
}
您可以在代码顶部定义 USE_A
或 USE_B
,以便编译器选择正确的分支。
我确定我只是不知道该怎么称呼它,但我正在尝试在我的代码中进行切换以使我的对象成为两个子类型之一,将它们称为 X_A
和 X_B
,都是 X
的亚型。代码开关是一个常量/静态变量(基本上我希望能够在编译时快速在两种类型的内部数据库之间进行选择)。
我看到 2 个选项:
- 使用 if 语句:
X theObj;
if (theType=="A") theObj = new X_A();
else theObj = new X_B();
- 使用反射(如here)
Type type = typeof(X_A);
X theObj = (X)Activator.CreateInstance(type);
有没有更简洁的方法?一个像 (2) 但有静态类型检查?也许是编译器指令之类的?
(此外,我只是不更改创建对象的一行代码的原因是实际上在我的代码中有几个这样的代码,所以我不会更改每一个..因此偏好(2) 的更好版本。)
如果是在编译时使用 #if
compile-time 指令。
#define USE_A
class Foo
{
X NewX()
{
#if USE_A
return new X_A();
#elif USE_B
return new X_B();
#else
throw new NotSupportedException();
#endif
}
}
您可以在代码顶部定义 USE_A
或 USE_B
,以便编译器选择正确的分支。