在.NET中编译时检查是否存在引用/类型

时间:2009-06-04 22:48:16

标签: c# .net types reference compile-time

我最近发现需要检查编译时是否:a)某个程序集引用存在且可以成功解析,或b)某个类(其完全限定名称)已知)已定义。这两种情况对我来说是相同的,所以能够检查其中一种情况就足够了。在.NET / C#中有没有办法做到这一点?预处理程序指令最初让我感到有些帮助,但它似乎没有必要的功能。

当然,在运行时检查类型的存在可以很容易地完成,但不幸的是,在这种情况下,这不会解决我的特定问题。 (我需要能够忽略某个引用丢失的事实,从而回退到代码中的另一种方法。)

3 个答案:

答案 0 :(得分:1)

是否有理由不能添加引用,然后在程序集的类型上使用typeof表达式来验证它是否可用?

var x = typeof(SomeTypeInSomeAssembly);

如果未引用包含SomeTypeInSomeAssembly的程序集并且可用,则无法编译。

答案 1 :(得分:1)

听起来你希望编译器忽略一个代码分支,这实际上只能将它隐藏在#if块后面。是否定义编译器常量并使用#if工作用于您的目的?

#if MyConstant
.... code here that uses the type ....
#else
.... workaround code ....
#endif

另一种选择是在编译时根本不依赖于其他类,并使用反射或.NET 4.0动态关键字来使用它。如果在.NET 3.5或更早版本的完全关键场景中重复调用它,您可以使用DynamicMethod在第一次使用时构建代码,而不是每次都使用反射。

答案 2 :(得分:1)

我似乎在这里找到了一个解决方案,尽管不是我最初希望的那样。

我的解决方案:

我最终做的是创建一个新的构建配置,然后定义一个预编译器常量,我在代码中使用它来确定是使用引用,还是回退到替代(保证工作)方法。它不是全自动的,但它相对简单,看起来非常优雅 - 足以满足我的目的。

<强>替代:

如果您想完全自动执行此操作,可以使用运行批处理脚本/小程序的预构建命令来检查计算机上给定引用的可用性,然后更新包含预编译器常量的文件。然而,我考虑了更多的努力而不是它的价值,尽管如果我有多个独立的引用我需要解决(检查可用性)可能会更有用。