如果您考虑一下,没有理由拥有在运行时确定类型的泛型。泛型提供强类型,但这只有在编译时知道类型时才有可能。这是泛型的最大优势之一,它提供了安全性,因为您知道对象可以执行哪些操作。在运行时,如果你不知道你得到的是什么类型,那将违背这个目的,你将不得不深入研究强大的(但有时是危险的)反射世界。例如,
List<DateTime> list = new List<DateTime>();
foreach (DateTime item in list)
item.Minute + ": " + item.Hour
因为我在编译时知道类型,所以我可以将它存储在一个通用容器中,并且在使用它时我具有类型安全性。我知道该项目具有 Minute 和 Hour 属性。
如果要根据对象的类型执行操作,则使用 GetType() 方法。这是您进入运行时类型识别和处理的窗口。
Result PerformQuery(object unknownObject)
{
switch (object.GetType())
{
case typeof(ThisType): Do This; break;
case typeof(ThatType): Do That; break;
}
}
如果您要对对象做某事,那么您要么在编译时知道方法名称,这意味着您可以使用接口,
IFood hamburger = new Hamburger();
hamburger.BeEaten();
如果您没有或想要使用接口,您可以使用反射或动态,在这种情况下,如果我知道要调用什么方法,我会使用动态。
Result PerformQuery(object unknownObject)
{
if (object.GetType() == typeof(Pizza))
{
dynamic pizza = unknownObject;
pizza.BakeInOven() // since I checked and know it is type Pizza it is 'somewhat' safe to do this, unless Pizza class changes the name of BakeInOven method.
}
}
最后,如果您不知道要在编译时调用的方法,您可以使用反射。
string methodName = CalculateWhatMethodShouldBe();
MethodInfo myMethod = unknownObject.GetType().GetMethods().First(m => m.Name == methodName);
MethodInfo.Invoke(unknownObject);