【问题标题】:C# preprocessor define symbol based on environment variableC#预处理器根据环境变量定义符号
【发布时间】:2022-01-17 01:22:01
【问题描述】:

我有一些这样的逻辑:

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

我希望能够根据环境变量切换应用于方法的属性 就像如果设置了环境变量MYVAR,那么实际上定义符号'MYVAR',反之亦然。

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

可能的解决方案:

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

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

【问题讨论】:

  • 可以读取属性里面的环境变量。
  • 好的,这是一个选项,将公共属性添加到自定义属性并进行一些令人讨厌的反射。是否有更简单的方法仍然存在问题。
  • 您可以使用构建脚本将环境变量传递给编译器,但您的 C# 代码中的标识符不会为您寻找环境变量。在属性中使用代码也是错误的,因为它将在运行时评估,而 #if xxx 将在编译时评估。
  • TBH 没有遵循反射等的参与方式。你能解释一下你的用例吗,因为 ATM 似乎是更多的 x-y 问题。
  • 你可以使用 T4 模板来定义一个全局符号

标签: c# attributes preprocessor


【解决方案1】:

我找到了一个不错的解决方案。 是comment by Lasse V. Karlsen 给了我这个想法,并在area 中进行了更多搜索。

C#代码:

        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 ready):

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

说明:

如果环境。变量$MYVAR 设置为MYVAR,就像在C# 代码中一样,dotnet build 将用&lt;DefineConstants&gt;MYVAR&lt;/DefineConstants&gt; 替换csproj 文件,并且预处理器会将 #if MYVAR 评估为true。

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

IMO 这是一个非常好的调整,适用于不同的场景。谢谢各位指导。干杯。

注意:

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

【讨论】:

    猜你喜欢
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 2011-11-30
    • 2019-02-22
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多