c# - 通过 IList 后门通用列表

标签 c# generics ilist

我有一个场景,其中一个类加载一种类型的对象,由于抽象我不能使用泛型类(泛型往往像癌症一样传播 :) 但我经常想在检索到对象后使用泛型版本,这导致了这样的代码(简化):

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>工具 IList明确地。 实现转换为 T并调用常规(通用)方法。

因此,类型检查仅在您显式调用 IList 时发生方法。 例如:

void System.Collections.IList.Insert(int index, Object item) 
{
    ThrowHelper.IfNullAndNullsAreIllegalThenThrow<T>(item, ExceptionArgument.item); 

    try {
        Insert(index, (T) item); 
    }
    catch (InvalidCastException) {
        ThrowHelper.ThrowWrongValueTypeArgumentException(item, typeof(T));
    } 
}

它不使用 as关键字因为 T可能是值类型。
你只能写as T如果你写了where T : class .

关于c# - 通过 IList 后门通用列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4164863/