C# 如何使某些类实现接口,同时将这些类内置到程序集中

C# 如何使某些类实现接口,同时将这些类内置到程序集中,c#,interface,refactoring,C#,Interface,Refactoring,我的意思是,例如,有类A、类B和类C。A、B、C都有一个方法void M(),但它们都没有声明为实现任何接口 public class AAdapter : A, IMyInterface { } 所以我给出了一个带有void M()约束的接口。但是类A、B、C是程序集中的类型 是否有任何方法可以使用这些类,就好像它们已经实现了一个接口一样。没有,没有任何方法可以这样做 public class AAdapter : A, IMyInterface { } 但是,您可以编写从A、B和C继承的

我的意思是,例如,有类A、类B和类C。A、B、C都有一个方法void M(),但它们都没有声明为实现任何接口

public class AAdapter : A, IMyInterface
{
}
所以我给出了一个带有void M()约束的接口。但是类A、B、C是程序集中的类型


是否有任何方法可以使用这些类,就好像它们已经实现了一个接口一样。

没有,没有任何方法可以这样做

public class AAdapter : A, IMyInterface
{
}
但是,您可以编写从A、B和C继承的适配器类并实现接口

public class AAdapter : A, IMyInterface
{
}

不,不能用这种方式修改现有类

您可以派生新类并说它们实现了新接口。基类中的现有方法将被选为接口实现

interface IWithM
{
  void M();
}

class MyA : A, IWithM
{
  // IWithM.M will be picked from A.M
}
用这个

您可以创建这些类的自己版本,然后装饰实现,而无需修改其他人拥有的程序集

您的界面:

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);
优点是,在使用自己的代码时,现在可以有一个约束


Distadvantage,然后您必须在程序集中使用您的类版本,而不是他们的版本。

您不控制程序集的代码吗?当然这是不可能的。你必须重写代码。使用反射是一个遥远的第二个解决方案。我提到的类是由其他团队维护的,我认为在我的情况下修改这些类不是一个好主意。所以我选择使用托马斯·列夫斯克和阿列克谢·列文科夫给出的解决方案。谢谢。