C#precompiler指令避免反射

时间:2015-04-09 16:38:17

标签: c# reflection compatibility preprocessor-directive

在我的场景中,我有相同库的某个版本。

例如,假设我的库名是lib.dll,并且该库有两个版本。

在这个例子中,每个库只包含一个只有一个方法的类(称为Dummy),但每个库中方法的签名都会发生变化,具体取决于版本。

现在我需要开发一个使用以前的lib.dll的新库,但需要与每个版本兼容。

假设版本为1.0.0.0的lib.dll支持该方法:

Dummy.Method ( int )

lib.dll版本2.0.0.0改为支持该方法:

Dummy.Method ( string , int )

在我使用lib.dll开发的库中,我可以与两个lib.dll版本反向兼容,但不使用反射来调用具有不同签名的方法。 是否支持预编译器语法:

 #IF lib.dll VERSION IS 1.0.0.0 
      Dummy.Method ( 1 ) ;
 #ENDIF

 #IF lib.dll VERSION IS 2.0.0.0 
      Dummy.Method ( "test" , 1 ) ;
 #ENDIF

以便根据库的引用版本;一个代码分支,或另一个代码分支。

1 个答案:

答案 0 :(得分:1)

Visual Studio 2019 下的 C# 确实可以实现这一点。

它们被称为生成器。

(见https://devblogs.microsoft.com/dotnet/introducing-c-source-generators/)。

这个想法是在编译时创建你的方法。 因此,生成器将检查 lib.dll 版本并生成足够的代码来调用实际方法 - 上面的 Dummy.method()。