C# 将另一个类中的函数分配给事件处理程序

C# 将另一个类中的函数分配给事件处理程序,c#,.net-3.5,C#,.net 3.5,考虑以下情况。我在不同的cs文件中有4个类: class0.cs class1.cs class2.cs class3.cs 我希望最后3个类是固定的(在dll中使用它们),并且只更改使用dll的类0 因此,在class0中,我想定义一个在事件发生时执行的函数。例如: public void callStart(Object x, EventArg e){...} 此事件应由class3的对象响应。这两门课之间有关系 class0 use an instance of class1 clas

考虑以下情况。我在不同的cs文件中有4个类:

class0.cs
class1.cs
class2.cs
class3.cs
我希望最后3个类是固定的(在dll中使用它们),并且只更改使用dll的类0

因此,在class0中,我想定义一个在事件发生时执行的函数。例如:

public void callStart(Object x, EventArg e){...}
此事件应由class3的对象响应。这两门课之间有关系

class0 use an instance of class1
class1 use an instance of class2
class2 use an instance of class3
因此,我的计划是将函数callStart作为构造函数的参数传递,以便它可以到达class3的对象:

每个类的构造函数是这样的:

public class1(...., Func<Object,EventArg> callStart){
...
c2 = new class2(..., callStart);
}

public class2(...., Func<Object,EventArg> callStart){
...
c3 = new class3(..., callStart);
}

public class3(...., Func<Object,EventArg> callStart){...

OnCall += callStart;
}
public类1(..,Func callStart){
...
c2=新类2(…,调用开始);
}
公共类2(..,Func callStart){
...
c3=新类3(…,callStart);
}
公共类3(..,Func callStart){。。。
OnCall+=callStart;
}
Visual Studio 2015中的编译器告诉我不能将
Func
转换为
EventHandler
,但是如果我直接在class3.cs中定义它,我可以为EventHandler分配一个public void函数


如果我对问题的描述令人困惑,我道歉。我觉得我的脑细胞被缠住了。

按照@Peter的建议,解决这个问题相当容易。首先,我更改了
操作的
Func
参数。然后我将事件订阅从
OnCall+=callStart
to
OnCall+=(发送方,e)=>callStart(发送方,e)

在这个问题的示例中,生成的代码是:

public class1(...., Action<Object,EventArg> callStart){
...
c2 = new class2(..., callStart);
}

public class2(...., Action<Object,EventArg> callStart){
...
c3 = new class3(..., callStart);
}

public class3(...., Action<Object,EventArg> callStart){...

OnCall += (sender, e) => callStart(sender, e);
}
public class1(..,Action callStart){
...
c2=新类2(…,调用开始);
}
公共类2(..,动作调用开始){
...
c3=新类3(…,callStart);
}
公共类3(..,操作调用开始){。。。
OnCall+=(发送方,e)=>callStart(发送方,e);
}

不清楚您在问什么。为什么不直接使用
EventHandler
作为参数类型?但是我可以指定一个公共的空函数--对于委托值分配,类型必须完全匹配,但当使用隐式方法组进行委托类型转换时,只要方法签名匹配,编译器将自动为您生成正确的委托类型实例。请注意,如果无法替换方法参数列表中的类型,则可以将事件订阅更改为
OnCall+=(sender,e)=>callStart(sender,e)Action
EventHandler
Func
更合适的推论,因为
EventHandler
的方法签名具有
void
返回类型。您确定您的方法参数使用了
Func
?如果是这样的话,您不能直接使用我在前面的注释中建议的语法,因为该委托类型的方法签名只有一个参数(类型为
object
),并返回类型为
EventArgs
)的值。谢谢您的注释。我认为callStart并不真正需要参数,因此我将尝试实施您的建议。非常感谢。@PeterDuniho它起作用了!谢谢你,先生。如果你愿意,你可以写下答案,我会投赞成票。很高兴听到你的答案有效。我提出了几个建议,但我不知道其中哪一个确实帮助了你。你应该写下自己的答案,清楚明确地说明你是如何解决问题的。然后,您可以单击“接受”复选标记,以便其他人能够轻松看到您的问题已得到解决。