这类似于我找到的其他一些线程,但我还没有找到我需要的答案。我希望得到一个直接的回答,即使是“不,你不能那样做”。
有没有一种方法可以在类/类型存在时使用一个代码块,如果不存在则使用另一个代码块。结果将与使用预处理器指令相同,但无需 #define 和手动注释或取消注释文件中的某些内容。
这可能是一个特殊的用例。我不知道。我在一个环境中工作,在编译任何东西之前,可以安装或不安装文件集。所以有人可以购买一个“安装”的插件(添加到项目中的文件),这使得类/类型可供使用(如扩展 API)。如果有人没有我们的其他插件包之一,我需要提供一种解决方法。我希望这是有道理的。
除非我们必须这样做,否则要求某人打开我们的一个文件(如果他们有另一个插件)取消对预处理器指令的注释对用户来说是不友好的。
例如,我知道这不起作用,因为它只在使用 #define 时测试布尔值,但它说明了我正在尝试做什么......
#if SomeType
SomeType.DoSomething();
#else
DefaultWay.DoSomething();
Run Code Online (Sandbox Code Playgroud)
编辑:我将此添加为 C# 功能建议。请在这里投票:http : //visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2297494-add-type-testing-as-preprocessor-directive
我不知道反射是如何做到这一点的,但我是 C# 的新手,所以如果可能的话,使用重选的例子会很棒。
我四处搜索,找不到任何这样做的例子,虽然这很有帮助:
我有一个泛型函数,它将函数包装在API中(我无法触及).包装函数采用System.Enum并返回相同的函数.我的通用版本在本示例的非剥离版本中简化了相当多的内容.
问题是,我无法从T到System.Enum,或者再次回到原因,因为T不限于System.Enum(至少这是我的理解).
以下代码有效,但我很想知道是否有任何隐藏的陷阱或更好的方法,因为我对泛型非常新:
using System
using System.Collections.Generic
...
public T EnumWrapper<T>(T enumVar) where T : struct, IFormattable, IConvertible, IComparable
{
if (!typeof(T).IsEnum)
throw new ArgumentException("Generic Type must be a System.Enum")
// Use string parsing to get to an Enum and back out again
Enum e = (Enum)Enum.Parse(typeof(T), enumVar.ToString());
e = WrappedFunction(e);
return (T)Enum.Parse(typeof(T), e.ToString());
}
Run Code Online (Sandbox Code Playgroud)
如果这样可以,那就以此为例.我找不到这个,至少它是一个可行的解决方案.
在这种情况下,PS性能不是问题.我以为我认为字符串工作可能很慢而且我总是对性能提示感兴趣.