【发布时间】:2018-09-12 12:41:21
【问题描述】:
我正在编写一个希望在 Windows 和 Linux 上使用的类。
此类中的一种方法是访问Windows Registry
我希望实现的是在使用 Linux 机器时以某种方式禁用此特定方法。
首先,我做了一些研究,看看是否有针对 @ 的东西987654322@ 可以让我检查正在使用的操作系统,我找到了this 并且确实有效。
当我在访问方法时将它实现到我的代码中时,我希望禁用访问 Windows 注册表的方法,但最接近的方法是使用 switch 语句,类似这样
switch (OS)
{
case OSX:
return;
case LINUX:
return
}
致return,如果操作系统不受支持,这可行,但是我认为将其全部禁用会更好,而不是为该特定方法不支持的操作系统抛出错误
然后我继续查看preprocessor directives,认为如果我能够根据框架等检测和禁用部分代码,也许我可以使用类似的东西来禁用部分代码,具体取决于操作这样,即使尝试访问该方法,它们也永远不会被调用
我从那里继续查看是否可以使用 preprocessor directives 禁用部分代码。
我找到了 this。
我知道它适用于C++,但它似乎是我能找到的最接近我在.Net Core 中尝试实现的目标
在一个完美的世界中,它看起来像这样的
/// <summary>
/// Get the file mime type
/// </summary>
/// <param name="filePathLocation">file path location</param>
/// <returns></returns>
`#if WINDOWS`
public static string GetMimeType(this string filePathLocation)
{
if (filePathLocation.IsValidFilePath())
{
string mimeType = "application/unknown";
string ext = Path.GetExtension(filePathLocation).ToLower();
Microsoft.Win32.RegistryKey regKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext);
if (regKey != null && regKey.GetValue("Content Type") != null)
{
mimeType = regKey.GetValue("Content Type").ToString();
}
return mimeType;
}
return null;
}
`#endif`
我确实看到了#Define,所以我尝试了类似#define IS_WINDOWS 的方法,并将它与#if IS_WINDOWS 一起添加到我的班级中
但是,如果我希望一遍又一遍地重用静态类,我看不到如何更改该值。
【问题讨论】:
-
您能否在其他方面解释一下您已经找到的工作方法中您不喜欢什么?老实说,我不明白你为什么不想使用它。另外我不明白你为什么要使用预处理器指令。这些指令在编译开始之前定义并提供给编译器。所以也许我错了,但似乎你将无法在 Windows 上编译你的程序并在 Linux 上运行它。在这种情况下,您的
#if WINDOWS将是真实的,而实际上不是......
标签: c# .net-core preprocessor-directive