我有一个定义为:
的集合public class MyCollection : List<MyItem>
{
...
}
public class MyItem
{
...
}
使用linq,我可以使用Select方法返回一个IEnumerable,我可以在其上调用.ToList来获取IList但是有没有办法找回一种类型的MyCollection?因为我要实例化一个具有MyCollection类型属性的类,并且我想使用对象初始化。
例如:
public class MyClass
{
MyCollection TestCollection {get;set}
...
}
MyClass test = new MyClass()
{
...
TestCollection = SomeObject.Select(item => new MyItem()
{
...
}).ToList();
}
我收到编译错误,因为ToList返回List并且它无法转换为MyCollection对象。有没有办法做到这一点?
答案 0 :(得分:1)
您可以制作自己的扩展方法,从IEnumerable
构建您的集合,例如
public static class Extensions
{
public static MyCollection ToMyCollection(this IEnumerable<MyItem> items)
{
//build and return your collection
}
}
或MyItem
是您上下文中泛型类型的占位符:
public static class Extensions
{
public static MyCollection ToMyCollection<T>(this IEnumerable<T> items)
{
//build and return your collection
}
}
答案 1 :(得分:1)
您需要使用MyCollection
构建IEnumerable<MyItem>
个实例。添加如下构造函数:
public MyCollection(IEnumerable<MyItem> items) : base(items) {}
然后,当你去使用它时,你可以这样做:
TestCollection = new MyCollection(SomeObject.Select(item => new MyItem());
答案 2 :(得分:0)
只是模仿ToList
:
public static class MyCollectionExtensions {
public static MyCollection ToMyCollection(this IEnumerable<MyItem> source) {
if (source == null) throw new NullReferenceException();
return new MyCollection(source);
}
}
MyCollection
需要一个新的构造函数:
public class MyCollection : List<MyItem> {
public MyCollection() : base() { }
public MyCollection(IEnumerable<MyItem> source) : base(source) { }
...
}
此外,通常不建议为集合公开setter。你应该在集合中封装集合的变异:
public class MyClass {
public MyCollection TestCollection { get { ... } } // should return a read-only collection
public void Add(MyItem item) {
_testCollection.Add(item);
}
MyCollection _testCollection = ...;
...
}