1

我已经设法使用我在 MSDN 上的另一个线程上找到的一些代码创建了自己的 IList 子类。我添加了一些我自己的方法,并在基本场景中测试了这个类,它似乎工作正常。

问题是当我尝试使用常规的 .ToList() 方法时,我返回了一个 List 而不是我的自定义 pList。显然我需要将它转换为我的新类型,但我不确定如何。我是否需要在我的自定义 iList 中实现另一种方法以允许为其分配不同的格式?

我的班级声明如下所示。

public class pList<T> : IList<T>

詹姆士

4

5 回答 5

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();
于 2012-04-18T18:33:02.253 回答
4

您将无法将 aList<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);

要使用扩展方法,您必须确保该方法在范围内。我没有在我的示例中添加访问修饰符。放入internalpublic放入,视情况而定:

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
    {
        ...
于 2012-04-18T18:31:06.000 回答
2

您还可以定义隐式强制转换。

public static implicit operator pList<T>(List<T> other)
{
     //Code returning a pList
}
于 2012-04-18T18:32:53.807 回答
2

您需要创建一个返回新列表类型的扩展方法

public static List<TSource> ToMyList<TSource>(this IEnumerable<TSource> source)
{
    if (source == null)
    {
        throw ArgumentNullException("source");
    }
    return new pList<TSource>(source);
}
于 2012-04-18T18:33:20.817 回答
1

IList<T>是一个接口。不是一堂课。如果您将类视为 的实例IList<T>,则可以简单地回退而不是调用ToList()

// assume you're working with IList<string> instance = new pList<string>()
pList<string> castedBack = (pList<string>)instance;
于 2012-04-18T18:31:22.667 回答