假设我有一个.NET程序集A,它使用反射来加载程序集B和C(也是.NET)。这两个程序集都实现了许多大型接口(interface)(两者都相同)。在A中调用方法时,它会尝试使B进行工作。但是,B是不可靠的,可能会引发异常。现在,A具有两种模式,一种是将异常传播到A的调用者,另一种是在较稳定(但性能较低)的C上调用匹配方法。

是否有比将B公开的所有方法包装到B的所有接口(interface)的大型实现中更好的方法(更少的代码),而现在仅用代码将每个调用都包围起来,如下所示?程序集B和C对所选择的错误处理方法一无所知,因此它们无法实现逻辑。

public class BErrorWrapper : I1, I2, I3{
   ...
   public int DoSomeWork(int num){
      if (FailWithExceptions)
      {
         try
         {
            return B.DoSomeWork(num);
         }
         catch(MyLibException e)
         {
            return C.DoSomeWOrk(num);
         }
      }
      else
      {
         return B.DoSomeWork(num);
      }
   }
   ...
}

最佳答案

您可以这样做,这样可以节省一些重复:

public class BErrorWrapper : I1, I2, I3{
   ...
   public int DoSomeWork(int num){
      try
      {
         return B.DoSomeWork(num);
      }
      catch(MyLibException e)
      {
         if (FailWithExceptions) throw;
         return C.DoSomeWOrk(num);
      }
   }
   ...
}

09-25 16:07