C# 是否可以订阅由私有构造函数生成的类中的公共EventHandler,在该类中返回接口?

C# 是否可以订阅由私有构造函数生成的类中的公共EventHandler,在该类中返回接口?,c#,C#,我有一个公共类,它有一个publicEventHandler委托定义,但有一个私有构造函数。该类是使用静态方法创建的,我不知道在不公开公共构造函数的情况下是否或如何订阅它 下面的示例显示了使用HttpClient从静态方法返回的ISomeService。因此,类被实例化,但由于返回的是接口而不是类实例,因此没有用于调用someInstance.SomeEvent+=OnSomeEvent的“句柄” public class SomeService { public EventHandle

我有一个公共类,它有一个public
EventHandler
委托定义,但有一个私有构造函数。该类是使用静态方法创建的,我不知道在不公开公共构造函数的情况下是否或如何订阅它

下面的示例显示了使用HttpClient从静态方法
返回的
ISomeService
。因此,类被实例化,但由于返回的是接口而不是类实例,因此没有用于调用
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
}
公共类服务
{
公共事件处理程序;
私有只读HttpClientu HttpClient;
私有SomeService(HttpClient HttpClient)=>\u HttpClient=HttpClient;
使用HttpClient(HttpClient HttpClient)=>新SomeService(HttpClient)的公共静态服务;
//…调用某个事件的其他代码
}
我尝试创建一个方法来返回EventHandler,但这显然是错误的,并导致错误:
public EventHandler GetBusyEvent=>BusyEvent

我还尝试在
isomservice
接口中列出
EventHandler
委托,但这在VS2019中给出了错误:“接口不能包含实例字段”


这可能吗?我不想用公共构造函数重新设计这个类,但我不知道还有什么其他方法。

如果你有一个对
isomservice
的引用,你知道它是
SomeService
,那么你可以强制转换它

乙二醇


如果您知道某个
SomeService
引用了一个
SomeService
,那么您可以强制转换它

乙二醇


在C#中,事件和委托之间的区别很难解释

委托是一种类型,可以包含与规范匹配的函数列表。所以

public EventHandler<bool> SomeEvent;
上述代码实际上在类中创建了三个元素:

  • EventHandler类型的私有字段
  • 一个名为add_SomeEvent的公共方法
  • 一个名为remove\u SomeEvent的公共方法
  • 调用SomeEvent+=或SomeEvent-=映射到最后两个

    以下是ILDASM中的外观:

    现在,接口只能指定方法(属性是一对方法),因此当我们在接口中声明事件时,这意味着实现接口的类必须提供add和remove方法(上面的2和3)。它实际上并不要求类提供私有字段

    然而,从接口实现事件的最常见方法是以相同的方式声明它,这给了我们两个方法和字段,这是额外的(就接口而言)


    手动实现一个事件是可能的(虽然不是很常见),即两个为自己编写add和remove方法,并以某种方式(而不是简单的字段)存储实际委托。这样做通常是为了在一个类中有大量事件时节省内存,或者转发一个事件以由另一个类中的另一个事件管理。

    在C#中,事件和委托之间的区别很难解释

    委托是一种类型,可以包含与规范匹配的函数列表。所以

    public EventHandler<bool> SomeEvent;
    
    上述代码实际上在类中创建了三个元素:

  • EventHandler类型的私有字段
  • 一个名为add_SomeEvent的公共方法
  • 一个名为remove\u SomeEvent的公共方法
  • 调用SomeEvent+=或SomeEvent-=映射到最后两个

    以下是ILDASM中的外观:

    现在,接口只能指定方法(属性是一对方法),因此当我们在接口中声明事件时,这意味着实现接口的类必须提供add和remove方法(上面的2和3)。它实际上并不要求类提供私有字段

    然而,从接口实现事件的最常见方法是以相同的方式声明它,这给了我们两个方法和字段,这是额外的(就接口而言)


    手动实现一个事件是可能的(虽然不是很常见),即两个为自己编写add和remove方法,并以某种方式(而不是简单的字段)存储实际委托。这通常是为了在一个类中存在大量事件时节省内存,或者转发一个事件以由另一个类中的不同事件管理。

    使用私有构造函数没有问题。但是
    UsingHttpClient()
    应该是一个静态方法,这样您就可以在不使用
    SomeService
    实例的情况下调用它。请对您的问题进行更详细的描述,包括您的问题、您收到的错误消息以及与该错误消息相关的源代码。是的,很抱歉,我在记事本中编写时忘记了在
    static
    中复制。我稍后会补充更多细节。实际的代码比这要详细得多,我上次因为包含太多细节而被责骂。如果没有导致错误的代码,很难知道您的问题是什么。。。另外,“在ISomeService接口中列出EventHandler委托,但这是不允许的”也很奇怪-<代码>SomeService服务=getItSomehow();service.SomeEvent+=a=>{}都应该可以正常工作……当您将事件关键字放在接口中时,您还记得它吗?啊!刚刚注意到你的类中也没有event关键字。因此,您的类只是有一个名为SomeEvent的公共字段,它不会实现您现在在接口中声明的事件。这两种情况下都不能使用关键字事件。使用私有构造函数没有问题。但是
    使用httpclient()
    应该是一个静态方法,因此您可以
    public event EventHandler<bool> SomeEvent;