开放实现的开放通用接口类型不等于接口类型?

2023-11-27

在我看来,这是一个应该通过但没有通过的测试。

[TestMethod]
public void can_get_open_generic_interface_off_of_implementor()
{
    typeof(OpenGenericWithOpenService<>).GetInterfaces().First()
        .ShouldEqual(typeof(IGenericService<>));
}
public interface IGenericService<T> { }
public class OpenGenericWithOpenService<T> : IGenericService<T> { }
  1. 为什么这不通过?
  2. Given Type t = typeof(OpenGenericWithOpenService<>)如何获取 typeof(IGenericService)?

我通常很好奇,但如果您想知道我在做什么,我正在编写一个 Structuremap 约定,它将类实现的所有接口转发到实现(作为单例)。


OpenGenericWithOpenService<T>不只是实现随意的 IGenericService<>- 它实现了IGenericService<T>对于相同的T作为班级。

展示这一点的最好方法是稍微改变类:

public class OpenGenericWithOpenService<T1, T2> : IGenericService<T1> {}

现在重要的是,当您询问它实现的接口时,您知道可以转换为IGenericService<T1>但是(巧合除外)not IGenericService<T2>或任何其他实现。

换句话说,它并不完全开放 - 它被固定到该类具有的相同类型参数。

我一直不太擅长使用泛型术语,但我希望您明白我的意思。IGenericService<>是一个等待被赋予类型参数的类型;在这种情况下你已经got类型参数 - 它恰好是另一个类型参数!

这是一个将通过的测试:

[TestMethod]
public void can_get_open_generic_interface_off_of_implementor()
{
    Type[] typeParams = typeof(OpenGenericWithOpenService<>).GetGenericArguments();
    Type constructed = typeof(IGenericService<>).MakeGenericType(typeParams);
    typeof(OpenGenericWithOpenService<>).GetInterfaces().First()            
        .ShouldEqual(constructed);
}

如果你改变要实现的类(比如)IGenericService<int>相反,它会失败。

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

开放实现的开放通用接口类型不等于接口类型? 的相关文章

随机推荐

  • 聚合物预载旋转器

    有时聚合物加载需要一段时间 并且在使用时 页面保持空白 直到一切准备就绪 有没有办法在页面提供服务和聚合物完成其魔力的时间之间显示某些内容 The 文档描述了unresolved属性清除了其中一些问题 虽然申请很常见unresolved t
  • 如何使用 React.js 在 Sails.js 上渲染服务器端模板?

    我正在尝试使用 Sails js 和 React 构建一个同构应用程序 客户端部分很简单 但我遇到了服务器端渲染的问题 当我尝试使用 React 服务器渲染 jsx 文件时 我得到了以下信息 renderToString You must
  • 使用 Retrofit v1.9.0 添加重复参数

    有一个类似的问题被问到here 但我的情况有点不同 我正在尝试提出类似于以下内容的请求 我有两个问题让事情变得困难 首先 重复参数 多次设置 foo 的值 会阻止使用QueryMap 我无法选择以不同的方式传递查询字符串中的值 就像作为数组
  • 选择递增整数

    我想知道是否可以从mysql表中选择递增的整数 如果可能的话 我怎样才能实现这一目标 我的情况是 我有一堆数据 我需要做INSERT INTO newtable SELECT somefield FROM sometable 然而 有一个字
  • Restangular POST 始终为空

    我想我不明白 POST 是如何在 RESTful api 中完成的 当在 Restangular 中创建一个新对象时 var user name John id 123 Restangular one building 5 post use
  • IIS7:为所有 aspx 页面设置“无缓存”,但不包括图像/css/js

    我不想在任何地方缓存我的 aspx 页面 由于某种原因 IE 忽略从我的母版页设置的元标记 我想看看是否可以将 Http 响应标头设置为 Cache Control no cache 设置类似 HttpContext Current Res
  • WiX XmlConfig:在 XmlConfig 中嵌套 XmlConfig 的目的

    目的和 或收益是什么 除了增加创建 删除属性的可读性之外 嵌套一个XmlConfig另一个元素中的元素XmlConfig元素 我所指的示例 我正在使用WiX 3 6
  • 将 Castle Windsor 与 SignalR 集成 - 我应该如何处理这个问题?

    我正在开始使用 SignalR 一旦配置完所有内容 它就可以很好地工作 然而 我开发的几乎所有应用程序都使用 Castle Windsor 因此能够将它们一起使用会很棒 我想这样做的原因是这样我可以在持久连接内使用 Castle 依赖项 服
  • 如何将包含“include”关联的记录转换为 JSON

    如果我做类似的事情 result Appointment find all include gt staff logger debug result inspect 那么它只打印出约会数据 而不打印出相关的员工数据 如果我执行 result
  • C# 如何使用共享 HttpClient 传递 cookie

    我进行了以下设置 JS 客户端 gt Web Api gt Web Api 我需要将身份验证 cookie 一路向下发送 我的问题是将其从一个 Web api 发送到另一个 由于与使用 FormsAuthentication 的旧系统集成
  • 导入模块在终端中有效,但在 IDLE 中无效

    我正在尝试导入pyodbcWindows 计算机上的模块 它可以在终端中运行 但不能在 IDLE 中运行 IDLE中的错误信息是 Traceback most recent call last File FilePath Filename
  • 从圆上的 3 个点计算圆的中心和半径

    有人可以显示可以快速完成此操作的代码吗 假设我们得到三分 p1 p2 p3 按左 gt 右顺序 因此 解决方案还应该检查圆是否有效 即 p1 p2 p3 是否是逆时针的 要计算圆参数 请查看 http paulbourke net geom
  • 连接 python 和 javascript 进行双向通信

    我想通过 python 提供来自 javascript 代码的查询 但我在这个领域根本没有经验 我想要构建的是这样的 1 请求 js open connection server py for var i 0 i lt 10 i docum
  • 检查 Android 上的互联网连接

    我有以下代码用于检查我的应用程序上的互联网连接 wifi EDGE GPRS 3G 代码是 public static boolean checkConn Context ctx ConnectivityManager conMgr Con
  • 当内存不足时,如何防止变长数组崩溃?

    在支持可变长度数组之前 我会像这样动态分配它们 int foo size t n int arr malloc n sizeof int if arr return ENOMEM not enough memory else do stuf
  • 生成签名 apk 时出现“:app:lintVitalRelease”错误

    我尝试在 Google Play 上上传我的 apk 但遇到错误消息 您上传了可调试 APK 出于安全原因 您需要先禁用调试 然后才能将其发布到 Google Play 了解有关可调试 APK 的更多信息 然后我写了android debu
  • 调用 ObjectSpace.count_objects 时哈希键的含义是什么?

    在 Ruby 1 9 YARV 中 您可以获取所有当前分配的对象的计数 如下所示 ObjectSpace count objects 它返回一个像这样的哈希值 TOTAL gt 1226560 FREE gt 244204 T OBJECT
  • C# ToDictionary 的 JavaScript 等效项

    我正在寻找一种方法来获取以下列表 directory name Albert age 40 gender M name Suzanne age 27 gender F name Robert age 19 gender M name Con
  • 像 **++* 这样的选择器使用起来安全吗?

    我最近在尝试找到一种轻松分隔主要博客元素 例如段落和图像 的方法时遇到了这个 CSS 选择器 它的使用示例如下 post margin top 15px or post gt margin top 15px if you don t wan
  • 开放实现的开放通用接口类型不等于接口类型?

    在我看来 这是一个应该通过但没有通过的测试 TestMethod public void can get open generic interface off of implementor typeof OpenGenericWithOpe