加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 基于非实现接口的通用约束

发布时间:2020-12-16 02:01:12 所属栏目:百科 来源:网络整理
导读:我有一个带有工厂服务的应用程序,允许构建实例,同时解决必要的依赖注入.例如,我使用它来构建对话框视图模型.我有一个服务接口,如下所示: public interface IAsyncFactory{ TaskT BuildT() where T: class,IAsyncInitialize;} 理想情况下,我想拥有的是这样的
我有一个带有工厂服务的应用程序,允许构建实例,同时解决必要的依赖注入.例如,我使用它来构建对话框视图模型.我有一个服务接口,如下所示:

public interface IAsyncFactory
{
    Task<T> Build<T>() where T: class,IAsyncInitialize;
}

理想情况下,我想拥有的是这样的(伪语法,因为这不是直接可以实现的)

public interface IFactory
{
    Task<T> Build<T>() where T: class,IAsyncInitialize;

    T Build<T>() where T: class,!IAsyncInitialize;
}

这里的想法是,如果一个类支持IAsyncInitialize,我希望编译器解析为返回Task< T>的方法.因此从消费代码中可以明显看出它需要等待初始化.如果该类不支持IAsyncInitialize,我想直接返回该类. C#语法不允许这样做,但有没有不同的方法来实现我的目标?这里的主要目标是帮助提醒消费者类的实例化它的正确方法,这样对于具有异步初始化组件的类,我不会在初始化之前尝试使用它.

我能想到的最接近的是创建单独的Build和BuildAsync方法,如果为IAsyncInitialize类型调用Build,则会出现运行时错误,但这没有在编译时捕获错误的好处.

解决方法

通常,Microsoft建议在命名异步方法时添加async后缀.因此,您创建两个名为Build和BuildAsync的方法的假设是有道理的.

我认为除非你强迫开发人员用另一个接口(如ISynchronousInitialize)标记同步方法,否则没有办法强制执行“所有不实现IAsyncInitialize的类型应使用Build方法而不是BuildAsync”.

您可以尝试以下方法;

>而不是必须分离方法,只需实现一个具有以下签名的BuildAsync方法:

Task<T> BuildAsync<T>() where T: class

>在BuildAsync方法中,检查T是否实现IAsyncInitialize.如果是这种情况,只需在创建类型为T的对象后调用相关的初始化代码.否则,只需创建一个TaskCompletionSource对象并运行同步初始化代码,就好像它是异步的一样.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读