问题在于,当你使用泛型方法时,泛型类型的对象只能引用最基类型或泛型类型所约束的任何接口上的属性。如果没有约束,实际上就是object
类型,即所有类型的基类。因此,像这样的代码:
foreach (Cartoon c in list)
{
Console.WriteLine(c.);
}
会失败,因为你要求编译器隐式地将泛型类型(它只知道必须是或继承自object
)转换为Cartoon
类型。这种从基类到派生类的隐式转换是不可能存在的,因为不能有从基类到派生类的自定义隐式转换。
其他人已经指出,你可以将这个方法拆分为两个非泛型方法,但如果有条件,另一个可以采取的措施是使用接口来约束你的泛型类型,例如:
public interface ITvShow{
string Title {get;}
}
public Foo<T>(List<T> input) where T : ITvShow
这将允许你将电视节目的Title
属性定义为接口的成员,并在不对接口对象进行任何强制类型转换的情况下引用它,因为现在已知泛型对象实现了ITvShow
。但是,在你无法或不想为这些类型添加一个共同接口的情况下,存在泛型方法根据泛型类型的不同执行不同操作的有效用例。要做到这一点,你需要对列表或其中的对象进行类型转换。最优雅的方式是使用switch
语句。
public static void ShowList<T>(List<T> list)
{
switch(list){
case List<Cartoon> cartoons:
foreach (var cartoon in cartoons)
{
Console.WriteLine(cartoon.ToString());
}
break;
case List<Car> cars:
foreach (var car in cars)
{
Console.WriteLine(car.ToString());
}
break;
}
}