在调用者对象上调用来自被调用者的调用者方法

时间:2017-08-30 08:39:37

标签: c#

我们假设一个场景如下:

程序集A1是一个Windows应用程序,有一个名为C1的类,它有两个方法M1和M11 程序集A2是一个dll,有一个名为C2的类,它有一个名为M2的方法 A1引用了A2,但反之亦然。

我们在C1.M1()中调用C2.M2()。

现在在方法C2.M2()中,我想调用C1.M11(),在调用C2.M2()的确切对象上,但我不想将C1的对象传递给C2。 / p>

有办法做到这一点吗?

提前致谢!

感谢大家的回复。

[修改] 但我想知道是否有办法通过其他技术(如反射等)来实现,而不是改变方法的签名。谢谢!

2 个答案:

答案 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依赖于C2C2本身需要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