gpt4 book ai didi

c# - 在编译时为 switch case 生成 const 字符串

转载 作者:行者123 更新时间:2023-12-03 13:55:48 33 4
gpt4 key购买 nike

我们在基于 .net 4.5(重要)的遗留代码中有一个静态类,它定义了许多对象类型的常量字符串值(表示 x.GetType().ToString() 的值) ) 主要用于 switch 语句。

这尤其糟糕,因为某些重构会破坏所有这些 switch 语句,而且使用它的地方非常多,我们无法更改它。如果我现在写的话,我知道其他解决方案,但是:

有什么方法可以在不更改 switch 语句的情况下定义类型的 const 字符串来获取编译时类型,因为我在编译时拥有我需要的所有信息。

我知道 switch 语句在编译时被编译成一个查找表并且不计算 case 中的表达式,但是有什么方法可以在编译时定义一个 const 值吗?我唯一能想到的就是在构建之前动态生成代码。还有其他解决办法吗?

最佳答案

C# 6 引入了一个功能来解决这个问题,the nameof expression .

using System;

public class Program
{
public static void Main()
{
Test(new Foo());
Test(new Bar());
}

private static void Test(object x)
{
switch(x.GetType().ToString())
{
case nameof(Foo):
Console.WriteLine("Inside Foo's code");
break;

case nameof(Bar):
Console.WriteLine("Inside Bar's code");
break;
}
}
}

public class Foo {}
public class Bar {}

Run Example

nameof 中引用的FooBar 是类型,如果重命名该类,任何自动重构工具也会替换其中的类型nameof

编辑:没有捕捉到“不要修改开关”部分,您也可以将它与常量字符串一起使用。

const string FooName = nameof(Foo);
const string BarName = nameof(Bar);

private static void Test(object x)
{
switch(x.GetType().ToString())
{
case FooName:
Console.WriteLine("Inside Foo's code");
break;

case BarName:
Console.WriteLine("Inside Bar's code");
break;
}
}

更新:nameof 不返回带有命名空间的全名,仅返回类型名称,其中 Type.ToString() 确实包含命名空间.所以这可能行不通。


如果您不能使用 C# 6,另一个选择是使用 T4 Text templates为 switch 语句动态构建常量。唯一的问题是保存您引用的类型的程序集不能存在于您生成代码的同一程序集中。

以下代码假定您在同一解决方案中有一个名为 DataTrasferObjects 的项目,其中的类名为 FooBar

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="$(SolutionDir)\DataTrasferObjects\bin\Debug\DataTrasferObjects.dll" #>
<#@ import namespace="System" #>
<#@ output extension=".cs" #>

<#
Type fooType = typeof(DataTrasferObjects.Foo);
Type barType = typeof(DataTrasferObjects.Bar);
#>

public static class Names
{
public const string FooName = "<#= fooType.ToString() #>";
public const string BarName = "<#= barType.ToString() #>";
}

请注意,您需要 configure your build server在每次构建时自动重新生成代码。

关于c# - 在编译时为 switch case 生成 const 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30820389/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com