我想做类似的事情:
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类中收到一个编译错误,说明此方法的最佳重载匹配有一些无效的参数。
答案 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!");
}
}