C# 预处理器根据环境变量定义符号

2023-12-08

我有一些这样的逻辑:

#define MYVAR
...
#if MYVAR
[Attribute1]
#else
[Attribute2]
#endif

我希望能够根据环境变量切换应用于方法的属性 就像环境变量一样MYVAR设置后,然后实际定义符号“MYVAR”,反之亦然。

老实说,我不知道这是否可能。如果没有任何想法如何克服这个问题?我当然可以将其添加到方法本身中 - env.变量检查,但由于正在执行反射,我需要属性。 我可以创建一个自定义MyAttrbute(int mode)但我无法在其构造函数中添加逻辑来提取环境。变量,因为它必须是常量表达式。

可能的解决方案:

  • 就像第一条评论所暗示的那样,我可以阅读环境。自定义属性中的变量。仍然会有一些令人讨厌的反思要做。

  • 因为我使用 dotnet 命令在 Linux 上工作,所以我实际上可以将构建命令与预处理步骤捆绑在一起sed命令并添加虚拟占位符{{define_myvar}}到顶部.cs文件并根据 env 将其替换为空字符串或完整字符串。变量。这里没有反射,但不是很优雅。


我找到了一个很好的解决方案。 这是莱塞·V·卡尔森 (Lasse V. Karlsen) 评论这给了我这个想法并进行了更多的搜索area.

C# code:

        public static void Main(string[] args)
        {
#if MYVAR
            Log.Information("MYVAR defined!");
#else
            Log.Information("MYVAR not defined!");
#endif
        }

项目文件:

<PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <DefineConstants>$(MyVar)</DefineConstants>
</PropertyGroup>

命令:

dotnet build MyProject.csproj -p:MyVar=$MYVAR -c Debug
dotnet run --project=MyProject.csproj -c Debug --no-build

这些命令也可以工作(docker 就绪):

dotnet publish MyProject.csproj -c Release -p:MyVar=$MYVAR
dotnet MyProject.dll

解释:

如果环境。多变的$MYVAR被设定为MYVAR就像在 C# 代码中一样,dotnet build将用以下内容替换 csproj 文件<DefineConstants>MYVAR</DefineConstants>并且预处理器将评估 #if MYVAR为真。

如果环境变量$MYVAR未设置(又名空字符串)或设置为任何其他不同的价值 from MYVAR,预处理器会将条件评估为 false。

在我看来,这是一个非常好的调整,适用于不同的场景。谢谢你们的指导,伙计们。干杯。

Note:

就像问题中所述,我不关心环境变量的值,只关心它是否已定义,即它是否为空字符串。此外,C# 代码只是 PoC,因此使用日志记录比编写属性和折射更容易。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 预处理器根据环境变量定义符号 的相关文章

随机推荐