【发布时间】:2010-11-12 13:02:06
【问题描述】:
我有一个场景,一个类加载一种类型的对象,由于抽象我不能使用泛型类(泛型往往像癌症一样传播:) 但我经常想使用检索到的对象的泛型版本,这导致了这样的代码(简化):
List<SomeClass> items = Storage.LoadItems(filename).OfType<SomeClass>().ToList();
其中LoadItems返回一个List
public void LoadItems(string filename,IList list);
现在我可以这样做了
List<SomeClass> items = new List<SomeClass>();
LoadItems(filename,items);
这应该更有效。它似乎也更灵活一些,因为我可以采用现有列表并添加新项目。所以我的问题是,这是一种常见的模式还是你有不同/更好的方法来实现这一点?
我也有点好奇你能做到这一点,如果你尝试添加一个错误类型的对象你会得到一个异常,但这是否意味着泛型列表也会进行类型检查? (好像有点没必要)
编辑 将模式修改为
实际上可能会更优雅一些public IList LoadItems(string filename,IList list=null);
这样你可以流畅地使用语句,如果没有传递列表,你可以简单地实例化一个 List
【问题讨论】:
-
“如果你尝试添加一个错误类型的对象,你会得到一个异常,但这是否意味着泛型列表也会进行类型检查?”他们当然会。泛型是强类型的。为什么泛型在加载之前没有必要检查类型?
-
请问为什么抽象应该使泛型不可用?泛型和抽象应该相互支持。您可以在必要时为泛型类型使用占位符,例如 List
。 -
在某些情况下,如果您有很多工厂、接口等,使用(您自己的)类的通用版本会使事情变得非常困难或不可能,因为您预先不知道您的 T,而且它还需要很多其他类是通用的。我认为 Marc 也可以证明将泛型注入类结构的潜在问题 :)