c# - 如何创建返回实现接口(interface)的类的类型的方法的通用接口(interface)?

标签 c# generics types interface

我正在寻找一种方法来定义下面的“MethodA”,以便它返回一个类定义(System.Type),其中所述类型的实例实现“InterfaceB”

interface IMyInterface
{
  TType MethodA<TType, TInterface>() 
    : where TType : System.Type
    : where [instanceOf(TType)] : TInterface
}

(注意:instanceOf 当然不是真实的......)

我怀疑不可能在编译时获得这种验证。我希望有人能证明我错了。

预先感谢您的任何指导。

编辑:我更新了这个,希望更具体地说明返回的是 System.Type,后面的代码可以执行它:

var classType = myInterface.MethodA<(something, ISomeInterface)>();
ISomeInterface = new classType();  //--Assuming default constructor

我还没有真正关注这部分,只是对我的主要问题的理论构建更好奇。

最佳答案

您的问题有两种解释;一个是微不足道的,一个是不可能的,所以我将继续讨论这两个问题。

  1. 您想要返回同时实现 System.Type 的类型的实例。和TInterface

    这很简单:只需使用 where TType : Typewhere TType : TInterface

  2. 您想要返回 System.Type 的实例表示继承自 TInterface 的类型。

    这是不可能在 .NET(和 C#)类型系统中指定的。

    类型系统只能解析来自类型层次结构本身的信息,但不能强制执行诸如受限运行时属性值之类的“契约”。有一些关于默认构造函数等的 hack,但据我所知,甚至无法测试现有方法(例如,与 C++ 模板不同,更不用说 Qi 等人了)。

更新

请查看Michael Graczyk的评论.

另外:我刚刚发现 .NET 有代码契约检查器(静态和运行时):Microsoft DevLabs Code-Contracts for .NET 。我从未使用过它们,甚至对它们也不陌生,但这看起来很有趣!

但是,即使不看,我也很确定重载解析等将无法使用此类信息。

关于c# - 如何创建返回实现接口(interface)的类的类型的方法的通用接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11659526/

相关文章:

C 中 deque 可以存储 char* 吗?

c++ - 数据类型和结构

c# - 将 DateTime 转换为 long,反之亦然

java - 使用 java 泛型迭代枚举值

c++ - 本地类作为模板参数 - 实例化点

c++ - 从模板化类中提取类型

c# - 如何在 C# ASP.NET MVC 5 中找到我们来自的 View (内置方式)?

c# - 枚举未设置时会发生什么?

c# - 将字符串转换为安全字符串

c# - LINQ 中的通用扩展方法