强制泛型参数的类型是接口而不是特定类

Reu*_*ass 2 c# generics

鉴于这些接口和实现

interface IService {}
class Service : IService {}
Run Code Online (Sandbox Code Playgroud)

用通用方法

void Register<I>(I service)
{
    var type = typeof(I);
}
Run Code Online (Sandbox Code Playgroud)

如何使以下几行与泛型类型保持一致?

Register<IService>(new Service())    // type is 'IService'
Register(new Service());             // type is 'Service'
Run Code Online (Sandbox Code Playgroud)

有两种选择:

  • 这两行都是使用IServie类型编译的
  • 第二行无法编译

Jon*_*eet 7

你不能 - 没有办法将类型参数限制为一个接口.

当然,您可以执行执行时间检查,如果I不是接口,则抛出异常.(顺便说一句,命名约定表明这应该是T,而不是I.)