我有以下規範來幫助說明此問題:如何從具有基類型約束的泛型方法獲取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。但是,你的「訣竅」鑄造動態,使規格立即通過。 –