如何将2个物体统一成一个连贯的立面?

Ang*_*ker 2 c#

我正在使用来自第三方库的2个类,我们称之为Obj1和Obj2.它们具有几乎相同的集合属性和方法,节省了一些.两者都是独立的对象,不会从任何常见的东西继承.

问题是,在我的代码中,我必须为这两个对象提供2个路径,即使我对它们所做的工作是相同的.例:

void Foo1(Obj1 obj) {
     obj.Cost = calcCostObj1(obj);
     obj.Rate = generateRateObj1(obj);
     ... // 50 more lines of this
}

void Foo2(Obj2 obj) {
     obj.Cost = calcCostObj2(obj);
     obj.Rate = generateRateObj2(obj);
     ...
}
Run Code Online (Sandbox Code Playgroud)

当然,我可以重载方法,但它仍然是两种方法几乎每个操作...

不幸的是,我无法修改第三方库.在C#中是否有一种方法(不太可能,我知道),我可以在某种程度上将这两个类统一到一个接口中,这样我就不必有两种方法来处理所有事情.

或者至少使情况具体化.

PS我的梦想场景(目前C#无法实现):

void Foo<T>(T obj) where T: Obj1, Obj2 {
    obj.Cost = calcCostObj<T>(obj);
    obj.Rate = calcRateObj<T>(obj);
}

// calling code
Obj1 obj = new Obj1();
Foo<Obj1>(obj);
Run Code Online (Sandbox Code Playgroud)

ale*_*lex 5

您可以创建一个接口,以及通过转发对Obj1和Obj2的调用来实现它的两个代理类.

interface IObj {
   int calcCostObj1();
   ...
}

class Obj1Wrapper: IObj {
   Obj1 obj;

   int calcCostObj1() {
       return obj1.calcCostObj1();
   }
}
Run Code Online (Sandbox Code Playgroud)

如果使用Resharper,则可以使用"委派成员"重构生成这些代理类