C#   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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对象并运行同步初始化代码,就好像它是异步的一样.

大佬总结

以上是大佬教程为你收集整理的c# – 基于非实现接口的通用约束全部内容,希望文章能够帮你解决c# – 基于非实现接口的通用约束所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。