2009-10-12 81 views
3

我从Generic.List<T>继承这样的自定义列表:演员与LINQ

public class TransferFileList<T> : List<TransferFile> { .. } 

当我设置(其中 'Files' 是TransferFileList<T>):

var files = uploadResponse.Files.Where(x => !x.Success).ToList() 

'files'对象解析为System.Collections.Generic.List<TransferFile>,而不是TransferFileList<T>,这是我所期望的,因为它是通过Where进行过滤的,因此ho我能否成功将TransferFileList<T>的列表返回到“文件”?

我曾尝试:

var files = uploadResponse.Files.Where(x => !x.Success).ToList() 
as TransferFileList<TransferFile>; 

,但使用安全铸造的,它只是解决了空。

谢谢你们和gals。

+0

你得到,如果“var中的文件内容= uploadResponse.Files.Where(X => X!成功)“? – 2009-10-12 01:49:51

+0

@Kirk OP将得到一个'IEnumerable ' – 2009-10-12 01:51:52

+0

System.Linq.Enumerable + WhereListIterator'1 [TransferFile] – GONeale 2009-10-12 01:52:38

回答

2

首先,我要问你为什么继承List<T>? 99%的时间这是一个坏主意。

如果你想扩展列表的功能,使用扩展方法:

public static something PrintErrors(this List<TransferFile> list) 
{ 
    //do your printing logic 
} 

在答案:ToList()所操作的IEnumerable<T>和序列的成员转换为相同类型的List 。由于您从List<T>继承,其实施IEnumerable<T>,那就是发生在那里。

Where()以同样的方式工作 - 在IEnumerable<T>上运行并返回IEnumerable<T>

为了得到一些随机列表类似的对象回,像你这样,你需要按顺序添加项目到您的自定义列表,就像这样:

var myFiles = new TransferFileList<TransferFile>(); 
myFiles.AddRange(originalFileList.Where(condition)); 
+0

雷克斯为什么不好?希望我是1%:)我有一个PrintErrors()方法,它将任何我的响应附加错误作为可打印字符串返回。 – GONeale 2009-10-12 01:54:04

+0

@GONeale因为没有什么像你期望的那样工作,所以当你从列表继承时,就像这种情况一样。看到我的修改答案替代。 – 2009-10-12 01:58:08

+0

非常好的一点就是X方法中的Rex,但是他们可以触及实例变量吗?我不这么认为,因为它们存在于实例之外,所以在printErrors中有这样一行:

string internalErrorMessage = StoreErrorBase.GetMessage(file.Error);
(file.Error)是'TransferFile'实例上的'Error'属性。 – GONeale 2009-10-12 01:59:31

1

您可以IEnumerable<TransferFile添加一个扩展方法>来处理方案:

public static TransferFileList ToTransferFileList(
    this IEnumerable<TransferFile> files) 
{ 
    return new TransferFileList(files); 
} 

// ... 

var files = uploadResponse.Files.Where(x => !x.Success).ToTransferFileList(); 

这为您提供了TransferFileList,而不只是一个List<TransferFile>。请注意您的as返回null的原因是因为虽然TransferFileListList<TransferFile>,但在另一个方向上不成立。也就是说,您的List<TransferFile>不是TransferFileList对象。

我同意@RexM,因为许多陷阱相关联,所以可以避免任何子类化List<T>的企图。我建议组合(有-A而不是-A)或坚持使用基类库集合。

+0

Downvote reason? – user7116 2009-10-12 01:53:21

+0

(15字母spacer)不是我。 – GONeale 2009-10-12 01:54:40

+0

我们不知道如果TransferFileList没有采用序列的ctor,并且即使这样做,也只是将症状视为不是问题的原因。 – 2009-10-12 02:00:20

0

谢谢你们。

我喜欢SLV的扩展方法,但有没有其他的直接铸造方法?

如果不是我可能只是去与恢复在线的方法,我希望避免:

var transferFiles = new TransferFileList<TransferFile>(); 
if (files != null) 
    transferFiles.AddRange(files);