我们假设一个场景如下:
程序集A1是一个Windows应用程序,有一个名为C1的类,它有两个方法M1和M11 程序集A2是一个dll,有一个名为C2的类,它有一个名为M2的方法 A1引用了A2,但反之亦然。
我们在C1.M1()中调用C2.M2()。
现在在方法C2.M2()中,我想调用C1.M11(),在调用C2.M2()的确切对象上,但我不想将C1的对象传递给C2。 / p>
有办法做到这一点吗?
提前致谢!
感谢大家的回复。
[修改] 但我想知道是否有办法通过其他技术(如反射等)来实现,而不是改变方法的签名。谢谢!
答案 0 :(得分:1)
也许你可以传递一个Function或Action参数。
这是一种允许指向调用者定义的某些代码的类型,因此您的dll不必了解您的调用应用程序。 您只需要定义要传递的代码的签名(即返回类型和参数类型)
如果代码有返回值,则为Function:
https://msdn.microsoft.com/en-us/library/bb549151(v=vs.110).aspx
如果代码没有返回值,则为Action:
https://msdn.microsoft.com/en-us/library/018hxwa8(v=vs.110).aspx
答案 1 :(得分:0)
对我来说似乎是一个设计缺陷。当C1
依赖于C2
而C2
本身需要C1
时,您会有一些循环依赖。由于您无法在C1
内访问C2
,因此您甚至无法将该引用传递给另一个。
您有两种方法可以解决这些依赖关系:
将委托注入C2
的实例:
var c1 = new C1();
var c2 = new C2(c1.M11);
使用
class C2
{
private readonly Action<MyType> Method;
public C2(Action<MyType> method)
{
this.Method = method;
}
// ...
M2()
{
// call the delegate
this.Method(instanceOfMytype);
}
}
另一种方法是在第三个程序集中提取C1
的接口,并将该实例传递给C2
。
interface MyInterface {
void M11(MyType) { ... }
}
// ...
var m = c1 as MyInterface;
var c2 = new C2(m);
现在在C2
范围内,您可以轻松调用接口方法M11
,而无需依赖C1
。