基于接口未实现的通用约束

2024-01-05

我有一个带有工厂服务的应用程序,可以在解决必要的依赖项注入的同时构建实例。例如,我用它来构建对话框视图模型。我有一个如下所示的服务接口:

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 and BuildAsync方法,如果您调用 Build ,则会出现运行时错误IAsyncInitialize类型,但这没有在编译时捕获错误的好处。


一般来说,微软建议添加async命名异步方法时的后缀。因此,您假设创建两个名为的方法Build and BuildAsync说得通。

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

您可以尝试以下方法;

  1. 不必分离方法,只需实现一个BuildAsync具有以下签名的方法:

    Task<T> BuildAsync<T>() where T: class
    
  2. In the BuildAsync方法检查是否T实施IAsyncInitialize。如果是这种情况,只需在创建类型的对象后调用相关的初始化代码即可T。否则,只需创建一个TaskCompletionSource对象并像异步一样运行同步初始化代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于接口未实现的通用约束 的相关文章

随机推荐

  • JSONArray 中的 POST 字符串和响应

    其实我关注了很多堆栈溢出 https stackoverflow com questions 28656865 send a jsonarray post request with android volley library答案与我的问题
  • 为什么这个 cppreference 摘录似乎错误地表明原子可以保护关键部分?

    int main std vector
  • 带有圆角图像的自定义 UIProgressView

    我在定制时遇到困难UIProgressView有两个图像 我在互联网上发现了很多有用的问题 但我的问题有点不同 也许我使用的图像在非角矩形上是圆角的 所以 stretchableImageWithLeftCapWidth方法似乎对我的情况没
  • sql - 两行之间的查询

    有疑问 我正在做一个选择 我需要抓取 2 行 我的值为 13000 00000 我需要抓住第 2 行和第 3 行 因为它 介于 10000 最小范围 和 15000 最小范围 之间 该语句仅引入第 2 行 select from TABLE
  • lambda 找不到我的 node_modules

    我正在尝试使用 lambda 上传 node modules 但我得到了 Cannot find module error 我已经设置了一个真正简单的 hello world js 文件 var async require async 我已
  • 如何在 Spark Scala 中将 null NAN 或 Infinite 值替换为默认值

    我正在将 csv 读入 Spark 并将架构设置为所有 DecimalType 10 0 列 当我查询数据时 出现以下错误 NumberFormatException Infinite or NaN 如果我的数据框中有 NaN null i
  • 使用 AJAX.NET 的 $get() 和 $find()

    我正在尝试遵循找到的 PageMethods 示例here http encosia com 2007 07 11 why aspnet ajax updatepanels are dangerous 但是 我在尝试调用时收到错误 get
  • Restlet HTTP 连接池

    我对 Restlet 相当陌生 编写了一小段代码来进行 HTTP 调用 它正在工作 但我想知道如何将 HTTP 连接池 apache 添加到其中 我找不到任何教程或参考代码 Client client new Client Protocol
  • 在 Java JFrame 中显示图像

    在 java JFrame 中的特定坐标处显示图像的最佳方法是什么 我知道有很多方法可以做到这一点 我只需要知道显示我计划在框架中移动的图像的最佳方式 将 ImageIcon 与 JLabel 结合使用是最简单的方法 实际上 您可以根据您的
  • 在 3d 中绘制 3 个向量

    我有 3 个向量 其中一个向量的角度为Phi 另一个角度为Teta 最后一个是点向量Y axe 计算完点后Teta Phi有一个功能 for teta 0 10 2 pi 2 for phi 0 10 2 pi 2 Y current v
  • android 蓝牙连接失败(isSocketAllowedBySecurityPolicy start : device null)

    我试图用蓝牙连接两部手机 galaxy note 1 galaxy note 2 但套接字连接失败 这是我的 LogCat I BluetoothService 24036 BEGIN mConnectThread D BluetoothU
  • 从左侧滑入CSS动画

    我想制作一个简单的动画 当页面加载时 我的徽标应该从框的左侧动画到右侧 我尝试了很多版本 但还没有成功 HTML div img src logo png alt logo style width 170px height 120px di
  • Kafka:使用java更改特定主题的分区数量

    我是 Kafka 新手 正在使用新的 KafkaProducer 和 KafkaConsumer 版本 0 9 0 1 java中是否有任何方法可以在创建特定主题后更改 更新其分区数量 我没有使用 Zookeeper 创建主题 当发布请求到
  • JavaScript 函数通过链式组合

    我检查了重复问题的可能性 并且无法找到准确的解决方案 我用 JavaScript 编写了一些函数链代码 如下所示 并且工作正常 var log function args console log args return function f
  • 浏览器同步无法用 gulp 重新加载

    我正在尝试按如下方式吞咽浏览器同步 var liveReload require browser sync create reload when something changes once scss is converted to css
  • 对话框的 Url 不适用于 angular.bootstrap (无限 $digest 循环)

    我有一个平均堆栈网站 我想用执行函数 https stackoverflow com a 45428344 702977绑定一个按钮以在对话框中启动该网站 function doSomethingAndShowDialog event cl
  • Tensorflow Keras 保留每批的损失

    我正在寻找构建 keras 模型架构的最佳实践的建议 示例 我一直在摸索 Model 子类和功能模型的各种迭代 但无法连接所有点 该模型应具有自定义指标和相关损失 其中 在训练期间 按批次计算指标 并在每个时期结束时根据批次计算的平均值计算
  • 无法解析符号“MediaSessionCompat”

    我无法导入MediaSessionCompat 导入整体的导入声明android support v4 media库不会显示在 Android Studio IntelliSense 中 并且无法解析其中任何内容的符号 我是否必须进行某种额
  • 悬停时动画不透明度 (jQuery)

    我们有一个链接 a href Some text span style width 50px height 50px background url image png span a 我们想要改变的不透明度 span 当链接悬停时带有一些动画
  • 基于接口未实现的通用约束

    我有一个带有工厂服务的应用程序 可以在解决必要的依赖项注入的同时构建实例 例如 我用它来构建对话框视图模型 我有一个如下所示的服务接口 public interface IAsyncFactory Task