2011-01-10 41 views
1

我有两个函数以两种不同的方式完成相同的事情。每使用一个不同的类来完成任务:有条件地包含基于类的存在的代码

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不存在,还有一种方法可以编译它吗?我可以用预处理器的东西来做到这一点吗(即,我可以在编译时告诉哪些内容包含在内?)

回答

3

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

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

一篇好文章可能是Martin Fowler's article on IoC。另外,您可能想看看Managed Extensibility Framework(现在包含在.NET 4中),这使得C#中的这一切变得非常简单。

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的构造函数。

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文件的方式相同。

相关问题