我有一个自定义列表,它继承自Generic.List<T>
,如下所示:
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
过滤的,所以如何我可以成功将TransferFileList<T>
列表返回到'文件'吗?
我确实尝试过:
var files = uploadResponse.Files.Where(x => !x.Success).ToList()
as TransferFileList<TransferFile>;
但是使用该安全转换,它只是解析为null。
谢谢你们和gals。
答案 0 :(得分:2)
首先,我要问你为什么要继承List<T>
? 99%的时间都是个坏主意。
如果要扩展列表的功能,请使用扩展方法:
public static something PrintErrors(this List<TransferFile> list)
{
//do your printing logic
}
回答:ToList()
对IEnumerable<T>
进行操作,并将序列成员转换为相同类型的List
。由于你继承了实现List<T>
的{{1}},那就是那里发生的事情。
IEnumerable<T>
的工作方式相同 - 在Where()
上操作并返回IEnumerable<T>
。
要获得一些类似于任意列表的对象,您需要将序列中的项目添加到自定义列表中,如下所示:
IEnumerable<T>
答案 1 :(得分:1)
您可以为IEnumerable<TransferFile
&gt;添加扩展方法处理这种情况:
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
的原因是因为虽然TransferFileList
是List<TransferFile>
,但同样不能保持另一个方向。也就是说,您的List<TransferFile>
不是TransferFileList
对象。
我同意@RexM,由于存在大量的陷阱,因此可以避免任何子类化List<T>
的尝试。我建议使用Composition(Has-A而不是Is-A)或者坚持使用基类库集合。
答案 2 :(得分:0)
谢谢你们。
我喜欢SLV的扩展方法,但还有其他直接投射方法吗?
如果不是,我可能会采用恢复的在线方法,我希望避免:
var transferFiles = new TransferFileList<TransferFile>();
if (files != null)
transferFiles.AddRange(files);