我认为这里的问题是服务类型是
不
一个泛型类型定义,而实现类型
是
. 以下测试全部通过,证明了这一点:
[Test]
public void ServiceIsNotGenericTypeDefinition() {
var service = typeof(IRequestHandler<>).MakeGenericType(typeof(GenericTestRequest<>));
Assert.IsFalse(service.IsGenericTypeDefinition);
}
[Test]
public void ImplementationIsGenericTypeDefinition() {
var implementation = typeof (GenericTestRequestHandler<>);
Assert.IsTrue(implementation.IsGenericTypeDefinition);
}
[Test]
[ExpectedException(typeof(InvalidOperationException))]
public void FillOpenGenericType() {
var service = typeof(IRequestHandler<>).MakeGenericType(typeof(GenericTestRequest<>));
service.MakeGenericType(typeof (string));
}
这是因为接口上的实际打开参数类型是“内部”类型,而不是“结果”类型。
所以这就像在接口中注册一个组件
ICollection
(不是一般的
集合
!)和实现类型
List<>
. 当你向温莎要
集合
,它不知道要应用于实现类型的类型参数。
你的情况更糟,因为你要求
IRequestHandler<GenericTestRequest<String>>
这不是真正注册的。(
IRequestHandler<GenericTestRequest<>>
是
)
希望这是清楚的…