我已经设法使用在MSDN上的另一个线程上找到的一些代码创建我自己的IList子类。我添加了一些自己的方法,并在基本场景中测试了类,它似乎工作正常。
问题是当我尝试使用常规.ToList()方法时,我返回了一个List而不是我的自定义pList。显然我需要将它投射到我的新类型,但我不确定如何。我是否需要在自定义iList中实现另一种方法,以便为其分配不同的格式?
我的课程如下所示。
public class pList<T> : IList<T>
詹姆斯
答案 0 :(得分:4)
您将无法将List<T>
直接投射到pList<T>
。你可以制作一个扩展方法(就像ToList
)。假设你的类有一个构造函数,它使IEnumerable<T>
填充列表:
static class EnumerableExtensions
{
static pList<T> ToPList<T>(this IEnumerable<T> sequence) { return new pList<T>(sequence); }
}
如果你的类没有这样的构造函数,你可以添加一个,或者做这样的事情:
static class EnumerableExtensions
{
static pList<T> ToPList<T>(this IEnumerable<T> sequence)
{
var result = new pList<T>();
foreach (var item in sequence)
result.Add(item);
return result;
}
}
我的pList类确实有一个构造函数,它使IEnumerable添加了你的扩展方法,但我仍然无法在列表中看到ToPList()我错过了什么?
首先,如果您有这样的构造函数,并且想要将现有的List<T>
转换为pList<T>
,那么您当然可以这样做:
List<T> originalList = GetTheListSomehow();
var newList = new pList<T>(originalList);
要使用扩展方法,您必须确保该方法在范围内。我没有在我的示例中添加访问修饰符。酌情将internal
或public
放入:
public static class EnumerableExtensions
{
internal static pList<T> ToPList<T> //...
此外,如果要在不同的命名空间中使用扩展方法,则必须在范围内具有using
指令。例如:
namespace A { public static class EnumerableExtensions { ...
其他地方:
using A;
// here you can use the extension method
namespace B
{
public class C
{
...
或
namespace B
{
using A;
// here you can use the extension method
public class C
{
...
答案 1 :(得分:4)
我不确定你打算完成什么,但也许你可以添加以下代码:
// Constructor which handles enumerations of items
public pList(IEnumerable<T> items)
{
// this.innerCollection = new Something(items);
}
然后使用扩展方法:
public static class pListExtensions
{
public static pList<T> ToPList<T>(this IEnumerable<T> items)
{
return new pList<T>(items);
}
}
稍后在您的代码中使用:
var items = (from t in db.Table
where condition(t)
select new { Foo = bar(t), Frob = t.ToString() }).ToPList();
答案 2 :(得分:2)
您还可以定义implicit演员。
public static implicit operator pList<T>(List<T> other)
{
//Code returning a pList
}
答案 3 :(得分:2)
您需要创建一个返回新列表类型的扩展方法
public static List<TSource> ToMyList<TSource>(this IEnumerable<TSource> source)
{
if (source == null)
{
throw ArgumentNullException("source");
}
return new pList<TSource>(source);
}
答案 4 :(得分:1)
IList<T>
是一个界面。不是一个班级。如果您将自己的课程视为IList<T>
的实例,则可以简单地退回而不是致电ToList()
:
// assume you're working with IList<string> instance = new pList<string>()
pList<string> castedBack = (pList<string>)instance;