是否可以在多个级别上传递委托?

时间:2014-09-29 14:07:05

标签: c# .net delegates

我想做类似的事情:

class A
{
     void Print(string message)
     {
         Console.WriteLine("Hi!");
     }
     B.Method1(Print);

}

class B
{
     delegate void Print(string message);

     void Method1(Print PrintOutput)
     {
         C.Method2(PrintOutput);
     }   
}

class C
{
     delegate void Print(string message);

     void Method2(Print PrintOutput)
     {
         PrintOutput("Bye!");
     }   
}

我尝试这样做的原因是我的第一个类(A)是WinForms应用程序中的一个类,它从一个来自不同项目的类中调用一个方法,但在同一个解决方案中,作为回报在同一解决方案中从另一个类(同样是不同的项目)调用另一个方法。我想从C类中调用A类中的方法。

如果我按照上面写的方式尝试这样做,我会在B类中收到一个编译错误,说明此方法的最佳重载匹配有一些无效的参数。

2 个答案:

答案 0 :(得分:2)

您收到错误消息是因为您声明了两个具有相同签名的不同委托类型,然后您尝试使用C.Method2中声明的委托访问class B

为避免这种情况,您必须明确声明类B中接受的委托类型属于C类型:

public void Method1(C.Print PrintOutput)
{
    var C = new C();
    C.Method2(PrintOutput);
}

或者,更好的方法是接受通用Action<string>而不是创建自己的:

class B
{
     public void Method1(Action<string> PrintOutput)
     {
         var C = new C();
         C.Method2(PrintOutput);
     }
}

class C
{
     public void Method2(Action<string> PrintOutput)
     {
         PrintOutput("Bye!");
     }   
}

答案 1 :(得分:0)

我认为行动代表可能是您正在寻找的:

public class A
{
    void Print(string message)
    {
        Console.WriteLine("Hi!");
    }

    public A()
    {
        new B().Method1(Print);
    }
}

public class B
{
    public void Method1(Action<string> PrintOutput)
    {
        new C().Method2(PrintOutput);
    }
}

public class C
{
    public void Method2(Action<string> PrintOutput)
    {
        PrintOutput("Bye!");
    }
}