我的意思是说,例如,有A类,B类和C类.A,B,C都有一个方法void M() ,但他们都没有声明实现任何接口。如何让一些类实现一个接口,而这些类内置到程序集中
所以我给一个void M()约束的接口。但是A,B,C类是程序集中的类型。
是否有任何方式使用这些类,就好像它们已经实现了接口一样。
我的意思是说,例如,有A类,B类和C类.A,B,C都有一个方法void M() ,但他们都没有声明实现任何接口。如何让一些类实现一个接口,而这些类内置到程序集中
所以我给一个void M()约束的接口。但是A,B,C类是程序集中的类型。
是否有任何方式使用这些类,就好像它们已经实现了接口一样。
不,您不能以这种方式修改现有的类。
您可以派生新类并说他们实现了新的接口。基类中的现有方法将被选为接口实现。
interface IWithM
{
void M();
}
class MyA : A, IWithM
{
// IWithM.M will be picked from A.M
}
不,没有办法做到这一点。
但是,您可以编写从A,B和C继承并实现接口的适配器类。
public class AAdapter : A, IMyInterface
{
}
真的有帮助。谢谢。 – 2013-02-17 14:02:25
您可以创建自己的这些类的版本,然后修饰实现,而不修改其他人拥有的程序集。
你的接口:
public interface IImplementsM()
{
void M();
}
public class MyA : IImplementsM
{
private A _a;
public MyA(A a){
_a = a;
}
public void M(){
_a.M();
}
}
然后在你的代码,而不是使用A
您可以使用自己的版本或接口。
// some other class
public void DoSomething(IImplementsM implementsM)
{
implementsM.M();
}
,并执行可能是这样的:
var myA = new MyA(new A());
DoSomething(myA);
优势,你现在可以有一个contraint在自己的代码时。
缺点,你必须在你的程序集中使用你的类的版本,而不是他们的。
你不控制组件的代码吗? – shenku 2013-02-16 02:58:53
当然这是不可能的。你必须重写该代码。使用反射是遥远的第二种解决方案。 – 2013-02-16 02:59:54
我提到的课程是由其他团队维护的,我不认为这些课程的修改对我而言是一个好主意。所以我选择使用Thomas Levesque和Alexei Levenkov给出的解决方案。非常感谢。 – 2013-02-17 14:00:26