在编译之前检测是否定义了类/类型

Raf*_*afe 7 c# types c-preprocessor

这类似于我找到的其他一些线程,但我还没有找到我需要的答案。我希望得到一个直接的回答,即使是“不,你不能那样做”。

有没有一种方法可以在类/类型存在时使用一个代码块,如果不存在则使用另一个代码块。结果将与使用预处理器指令相同,但无需 #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# 的新手,所以如果可能的话,使用重选的例子会很棒。

Rik*_*kon 5

而不是使用预编译器语句(如果客户端在安装插件后不必重新编译,我不知道它们是否会起作用),我建议查询程序集并尝试实例化按字符串分类,如下所示:

C# - 加载程序集、查找类和调用 Run() 方法的正确方法

Assembly assembly = Assembly.LoadFile(@"C:\dyn.dll"); 
Type     type     = assembly.GetType("TestRunner");  

if (type != null)
    //Do Something
Run Code Online (Sandbox Code Playgroud)

编辑以显示激活器调用

如果 type 不为 null,则使用它来创建所需类型的实例。

var      obj      = Activator.CreateInstance(type); 
Run Code Online (Sandbox Code Playgroud)