这是一个普遍的问题。假设我在A.dll中有一个X类,而B.dll引用A.dll和C.dll引用B.dll。
现在,我需要在C.dll(消费者代码)中使用X.所以我想要做的是在B.dll中创建一个包装器类X1并在消费者代码中使用它。所以这是问题所在?如何让X1成为一个(几乎)完美的X包装?
感谢。
答案 0 :(得分:1)
假设你想要一个包装器(而不仅仅是继承X),我建议你只需创建一个手动包装器。即创建一个具有类型X的私有变量的类X1。通过调用X中的相应成员来实现X的所有公共函数和属性。如果你需要的只是X的包装而没有别的,那么这将起作用。通过这种方式,您可以从B隐藏X(我认为这就是您想要的)。
A.DLL
public class X {
public int A { get; set; }
public bool DoSomething() {
A++;
}
}
B.DLL
public class X1 {
private X X;
X1() {
X = new X();
}
public int A { get { return X.A; } set { X.A = value } }
public bool DoSomething() {
return X.DoSomething();
}
}
从技术上讲,它不是一个包装器,但如果你想避免A.dll作为C.dll的直接引用
第三种方法是不包装X,而是使C.dll使用X作为未知对象。此方法使用C#中的调用站点和“动态”对象。这允许B.dll返回真正的X,而不必在编译时从C.dll显式引用它(假设你有充分的理由不这样做)。 Microsoft为C.dll的每个属性/函数调用创建了所谓的“调用站点”,因此开销非常低。这使得X非常完美,因为它确实是X.动态方法的好处是包装器将跟随对X的任何更改。坏的是C.dll将具有运行时绑定(没有编译错误)。
public static class X1 {
public static dynamic New() {
return new X();
}
}
答案 1 :(得分:0)
我认为很少有简单的解决方案: 我相信你正在计划洋葱层/建筑。
在'B'的X1类中继承'C'的X类,然后在'A'中使用X1。
在“B”的类X1中为“C”的X类创建一个工厂方法,然后在“A”中使用它。
在'B'的X1中创建'C'的X类对象并编写您想要的每个方法,并从这些方法将调用转发到原始类X.