我有以下规范来帮助说明此问题:如何从具有基类型约束的泛型方法获取typeof(T)?
class when_getting_type_of_generic_argument_using_subtype_instance
{
static GenericTypeTester _genericTypeTester;
static IPet _dog;
static Type _result;
Establish context =
() =>
{
_genericTypeTester = new GenericTypeTester();
_dog = new Dog();
};
Because of =
() => _result = _genericTypeTester.Test(_dog);
It should_return_the_subtype =
() => _result.ShouldEqual(_dog.GetType());
}
class Dog : IPet
{
}
interface IPet
{
}
class GenericTypeTester
{
public Type Test<T>(T dog) where T : IPet
{
return typeof (T);
}
}
上述规格失败,出现以下消息:
预期:System.RuntimeType:[Pepino.ScenarioRunner.Selenium.Specs。狗] 却被:System.RuntimeType:[Pepino.ScenarioRunner.Selenium.Specs.IPet]
我需要的结果是Dog
类型。有没有什么我可以做,而不使用反射?
变化'静态IPET _dog;''以静态的狗_dog;',你会看到类型转换成狗 – Grax
@Grax技术上是真实的,所以我会将其纳入我的答案 – David
@Grax是正确的,但在运行时,我没有那种奢侈。类型必须保持IPet。但是,你的“诀窍”铸造动态,使规格立即通过。 –