我有一些这样的逻辑:
#define MYVAR
...
#if MYVAR
[Attribute1]
#else
[Attribute2]
#endif
我希望能够根据环境变量切换应用于方法的属性
就像环境变量一样MYVAR
设置后,然后实际定义符号“MYVAR”,反之亦然。
老实说,我不知道这是否可能。如果没有任何想法如何克服这个问题?我当然可以将其添加到方法本身中 - env.变量检查,但由于正在执行反射,我需要属性。
我可以创建一个自定义MyAttrbute(int mode)
但我无法在其构造函数中添加逻辑来提取环境。变量,因为它必须是常量表达式。
可能的解决方案:
我找到了一个很好的解决方案。
这是莱塞·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(使用前将#替换为@)