【发布时间】: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