C# 如何转换为IList的子类型<;T>;从列表<;T>;

C# 如何转换为IList的子类型<;T>;从列表<;T>;,c#,.net,list,C#,.net,List,我已经使用在MSDN的另一个线程上找到的一些代码创建了自己的IList子类。我添加了一些自己的方法,并在基本场景中测试了该类,它似乎工作得很好 问题是,当我尝试使用常规的.ToList()方法时,返回的是一个列表,而不是自定义的pList。显然,我需要将它转换为我的新类型,但我不确定如何。我是否需要在自定义iList中实现另一个方法以允许使用不同的格式分配它 我的类声明如下所示 public class pList<T> : IList<T> 公共类pList:ILis

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

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

我的类声明如下所示

public class pList<T> : IList<T>
公共类pList:IList

James

您将无法将
列表直接投射到
pList
。您可以创建一个扩展方法(就像
ToList
)。假设您的类有一个构造函数,该构造函数采用
IEnumerable
填充列表:

static class EnumerableExtensions
{
    static pList<T> ToPList<T>(this IEnumerable<T> sequence) { return new pList<T>(sequence); }
}
此外,如果要在不同的命名空间中使用扩展方法,则必须在作用域中具有
using
指令。例如:

namespace A { public static class EnumerableExtensions { ...
其他地方:

using A;
// here you can use the extension method

namespace B
{
    public class C
    {
        ...


您将无法将
列表直接转换为
pList
。您可以创建一个扩展方法(就像
ToList
)。假设您的类有一个构造函数,该构造函数采用
IEnumerable
填充列表:

static class EnumerableExtensions
{
    static pList<T> ToPList<T>(this IEnumerable<T> sequence) { return new pList<T>(sequence); }
}
此外,如果要在不同的命名空间中使用扩展方法,则必须在作用域中具有
using
指令。例如:

namespace A { public static class EnumerableExtensions { ...
其他地方:

using A;
// here you can use the extension method

namespace B
{
    public class C
    {
        ...

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

//假设您正在使用IList instance=new pList()
pList castedBack=(pList)实例;
IList
是一个接口。不是一门课。如果将类视为
IList
的实例,则可以简单地回溯,而不是调用
ToList()

//假设您正在使用IList instance=new pList()
pList castedBack=(pList)实例;
您还可以定义强制转换

公共静态隐式运算符pList(列出其他)
{
//返回pList的代码
}
您还可以定义强制转换

公共静态隐式运算符pList(列出其他)
{
//返回pList的代码
}

我不确定您打算完成什么,但也许您可以添加以下代码:

// Constructor which handles enumerations of items
public pList(IEnumerable<T> items)
{
    // this.innerCollection = new Something(items);
}

我不确定您打算完成什么,但也许您可以添加以下代码:

// Constructor which handles enumerations of items
public pList(IEnumerable<T> items)
{
    // this.innerCollection = new Something(items);
}

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

public static List<TSource> ToMyList<TSource>(this IEnumerable<TSource> source)
{
    if (source == null)
    {
        throw ArgumentNullException("source");
    }
    return new pList<TSource>(source);
}
公共静态列表ToMyList(此IEnumerable源代码)
{
if(source==null)
{
抛出ArgumentNullException(“源”);
}
返回新的pList(源);
}

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

public static List<TSource> ToMyList<TSource>(this IEnumerable<TSource> source)
{
    if (source == null)
    {
        throw ArgumentNullException("source");
    }
    return new pList<TSource>(source);
}
公共静态列表ToMyList(此IEnumerable源代码)
{
if(source==null)
{
抛出ArgumentNullException(“源”);
}
返回新的pList(源);
}

Hello,我的pList类确实有一个接受IEnumerable的构造函数。我添加了扩展方法,但我仍然无法在列表中看到ToPList(),我是否遗漏了什么?@JarmezDeLaRocha“在
列表中
”是什么意思?你是说在智能感知中?是的,没错,当我做列表的时候。例如,我没有看到像tolist或toarray那样的toplist。我没抓住重点吗?我正在阅读这些扩展方法,现在它们对我来说是新的!您的扩展方法类需要对使用它的代码所在的位置可见,因此您可能需要使用
声明添加一个
。实际上您的解决方案确实帮助了我,设计很糟糕,实际上我从未研究过扩展方法。扩展方法允许我在pList中添加所需的方法,而无需实际创建新的子类。非常感谢您的帮助!大家好,我的pList类确实有一个接受IEnumerable的构造函数,我添加了你的扩展方法,但是我仍然无法在列表中看到ToPList(),我是不是遗漏了什么?@JarmezDeLaRocha“在
列表中
”是什么意思?你是说在智能感知中?是的,没错,当我做列表的时候。例如,我没有看到像tolist或toarray那样的toplist。我没抓住重点吗?我正在阅读这些扩展方法,现在它们对我来说是新的!您的扩展方法类需要对使用它的代码所在的位置可见,因此您可能需要使用
声明添加一个
。实际上您的解决方案确实帮助了我,设计很糟糕,实际上我从未研究过扩展方法。扩展方法允许我在pList中添加所需的方法,而无需实际创建新的子类。非常感谢您的帮助!还有其他回答的人。
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();
public static List<TSource> ToMyList<TSource>(this IEnumerable<TSource> source)
{
    if (source == null)
    {
        throw ArgumentNullException("source");
    }
    return new pList<TSource>(source);
}