c# – 基于非实现接口的通用约束
我有一个带有工厂服务的应用程序,允许构建实例,同时解决必要的依赖注入.例如,我使用它来构建对话框视图模型.我有一个服务接口,如下所示:
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对象并运行同步初始化代码,就好像它是异步的一样. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 在服务器端判断request来自Ajax请求(异步)还是传统请求(同步
- 浅谈vue的iview列表table render函数设置DOM属性值的方法
- xml to datatable
- ios – 如何为Mac OS X创建Apple邮件插件
- 通過XML設置屏幕方向(android:screenOrientation)详解
- 使用echarts-for-react 绘制折线图 报错:`series.type sho
- Ajax工作原理
- c# – 在Linux上使用.NET / Mono来提供高容量的Web服务,这是
- Oracle 11G统计信息自动收集及调整
- Linq技术二:Linq to XML及xml增删改查的不同实现方式