大佬教程收集整理的这篇文章主要介绍了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,则会出现运行时错误,但这没有在编译时捕获错误的好处.
我认为除非你强迫开发人员用另一个接口(如ISynchronousInitializE)标记同步方法,否则没有办法强制执行“所有不实现IAsyncInitialize的类型应使用Build方法而不是BuildAsync”.
您可以尝试以下方法;
>而不是必须分离方法,只需实现一个具有以下签名的BuildAsync方法:
Task<T> BuildAsync<T>() where T: class
>在BuildAsync方法中,检查T是否实现IAsyncInitialize.如果是这种情况,只需在创建类型为T的对象后调用相关的初始化代码.否则,只需创建一个TaskCompletionsource对象并运行同步初始化代码,就好像它是异步的一样.
以上是大佬教程为你收集整理的c# – 基于非实现接口的通用约束全部内容,希望文章能够帮你解决c# – 基于非实现接口的通用约束所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。