c# - 如何在c#中添加具有泛型的抽象类作为委托的参数
问题描述
我有一个StatesHandler
用泛型类型调用的抽象类T
。在这个类中,我有一个从类中调用的委托:
public abstract class StatesHandler<T>
{
public event Action<StatesHandler<T>> OnStatesChanged;
private void Function(){
OnStatesChanged(this);
}
}
然后我有这个抽象类的实现,State
枚举在哪里:
public class MyStatesHandler : StatesHandler<State>{}
在第三个类中,我向这个委托添加了一个监听器:
public class MyThirdClass
{
private MyStatesHandler myStatesHandler;
private void AddListener()
{
myStatesHandler.OnStatesChanged += StateChanged;
}
private void StateChanged(StatesHandler<State> statesHandler)
{
}
}
我的问题是为什么添加到侦听器的函数需要具有签名StatesHandler<State>
而不是简单的MyStatesHandler
?
两者都不应该工作吗?
解决方案
OnStatesChanged
将 aStatesHandler<T>
或任何从StatesHandler<T>
.
因此假设我们也有
public class SomeOtherHandler : StatesHandler<State>{}
可以调用OnStatesChanged
将此类的对象作为参数传递,因为它派生自StatesHandler<T>
. 但是,这不能传递给
private void StateChanged(MyStatesHandler statesHandler)
{
}
MyStatesHandler
因为和之间没有继承关系SomeOtherHandler
。
因此,事件处理程序必须采用基类参数。
推荐阅读
- entity-framework-core - 为 Azure cosmos DB 和 EF Core 设计 C# 实体
- php - 使用 SoapClient 发出请求时如何向元素添加属性
- unit-testing - 如何对单个会话语句进行单元测试
- c++ - 致命错误:cpr/cpr.h:没有这样的文件或目录
- node.js - 相对于文件位置运行脚本,而不是节点中的命令行位置
- python-3.x - 为什么我在第四行得到无效的语法?
- reactjs - 如何使用 Formik 中的一个验证模式字段验证多封电子邮件?
- nlp - 向 Spacy 词形还原添加规则
- json - 将多个 JSON 字段反序列化为 serde 中的单个 Vec
- c - 如何从 SAS 令牌中解码 Azure MQTT 用户名和密码?