有条件地包括基于类的存在的代码

时间:2011-01-10 20:20:11

标签: c# c-preprocessor

我有两个功能,它们以两种不同的方式完成同样的事情。每个人都使用不同的类来完成任务:

void functionA()
{
  ClassA a = new ClassA();
  a.doWork();
}

void functionB()
{
  ClassB b = new ClassB();
  b.doSomething();
}

这一切都在一个自包含的HttpHandler中,可以在任何项目和工作中被删除 - 至少这就是目标。 FunctionA将是首选的方式,FunctionB是一个后备。 ClassA可能不存在于给定项目中,ClassB将始终存在。

有没有办法在运行时检测到ClassA是否存在使用函数A,如果不使用fcuntionB。如果ClassA不存在,还有一种方法可以编译它吗?我可以用预处理器的东西来做这件事(也就是说,我可以在编译时告诉包含哪些内容?)

4 个答案:

答案 0 :(得分:3)

通常情况下,通过Inversion of Control处理这样的情况比尝试确定某个类的存在要好得多。

不是寻找“ClassA”和“ClassB”,而是提供可实现的2个接口的更好选择。然后,您可以使用Dependency Injection尝试注入IInterfaceA的实例,如果失败,请使用IInterfaceB的实例。

要阅读的好文章可能是Martin Fowler's article on IoC。此外,您可能希望查看Managed Extensibility Framework(现在包含在.NET 4中),这使得在C#中非常容易。

答案 1 :(得分:0)

如果必须使用预处理器#if#define指令,那么在ClassA中添加

#define ClassA

HttpHandler添加

#if ClassA
  void function() { ClassA a = new ClassA(); a.doWork(); }
#else
  void function() { ClassB b = new ClassB(); b.doSomething(); }
#endif

如果可能,最好使用dependency injection并将其传递给HttpHandler的构造函数。

答案 2 :(得分:0)

您可以使用partial关键字将您的班级拆分为两个文件:

// MyClass.cs -- include this into every project
public partial class MyClass {
    public void functionB() { ClassB b = new ClassB(); b.doSomething(); }
}

// MyClass.functionA.cs -- include only into projects that have ClassA
public partial class MyClass {
    public void functionA() { ClassA a = new ClassA(); a.doWork(); }
}

我们在代码中执行了一些操作。我喜欢“BaseName.Specialty.cs”命名约定,因为解决方案资源管理器会自动将MyClass.functionA.cs显示为嵌套在MyClass.cs下的子节点,就像它对.designer.cs文件一样。

答案 3 :(得分:0)

您可以使用反射(http://msdn.microsoft.com/en-us/library/f7ykdhsy(v=vs.71).aspx)。特别是System.Reflection.Module,它可以返回模块中可用类型的列表(http://msdn.microsoft.com/en-US/library/system.reflection.module.gettypes(v=VS.80).aspx)。我想你只要知道哪种类型存在就可以简单地投射。

相关问题