我正在使用来自第三方库的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)
您可以创建一个接口,以及通过转发对Obj1和Obj2的调用来实现它的两个代理类.
interface IObj {
int calcCostObj1();
...
}
class Obj1Wrapper: IObj {
Obj1 obj;
int calcCostObj1() {
return obj1.calcCostObj1();
}
}
Run Code Online (Sandbox Code Playgroud)
如果使用Resharper,则可以使用"委派成员"重构生成这些代理类