c# - 是否可以在返回接口的私有构造函数生成的类中订阅公共 EventHandler?
问题描述
我有一个带有公共EventHandler
委托定义但有一个私有构造函数的公共类。该类是使用静态方法创建的,我不知道是否或如何在不公开公共构造函数的情况下订阅它。
下面的示例显示ISomeService
从静态方法返回UsingHttpClient
。所以类被实例化了,但是由于返回的是接口而不是类实例,所以没有'句柄'可以用来调用someInstance.SomeEvent += OnSomeEvent
。
public class SomeService
{
public EventHandler<bool> SomeEvent;
private readonly HttpClient _httpClient;
private SomeService(HttpClient httpclient) => _httpClient = httpClient;
public static ISomeService UsingHttpClient(HttpClient httpClient) => new SomeService(httpClient);
//...some other code invoking SomeEvent
}
我尝试创建一个返回 EventHandler 的方法,但这显然是错误的,并导致错误:public EventHandler<bool> GetBusyEvent => BusyEvent;
.
我也尝试EventHandler
在接口中列出委托,ISomeService
但这会在 VS2019 中出现错误:“接口不能包含实例字段”。
这甚至可能吗?我不想使用公共构造函数重新设计类,但我不知道任何其他方式。
解决方案
如果你有一个ISomeService
你知道是 a的引用SomeService
,那么你可以转换它。
例如
ISomeService svc = SomeService.UsingHttpClient(client);
if (svc is SomeService ss)
{
ss.SomeEvent += (s,a) =>
{
//whatever
};
}
推荐阅读
- amazon-web-services - 无法从 pod 访问外部 mongo 服务器,但能够从 EC2 实例连接
- javascript - 当文本变长时我的 d3 y 轴溢出,如何在图表中断字?
- css - tr元素样式的display属性初始值是多少?
- html - 导航栏中带有按钮的引导输入
- java - Eclipse - 使用新字符串的声纳 S2629 可能出现误报
- node.js - 如何在 kubernetes 上使用 redis 部署 node.js?
- javascript - 使用 JavaScript .map() 和 .filter() 按语言搜索作者/书籍数据模块
- angular - 无法在我的 Angular 6 视图中显示带有材料数据表的连接表数据
- javascript - 如何将值附加到 this.events
- c++ - 无法取消引用值初始化的双端队列迭代器