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