子类继承了父类但是子类的集合并没有继承于父类的集合,所以如果使用 子类集合 as 父类集合 这种方式进行转换时转换得到的将是null。
分析和实现:
试验时发现对象数组不受此限制,原因可能是集合存储的是数组内每一个对象指针的合集,而集合存储的是集合对象,所以存在此差别.
C#中的集合分为泛型集合与非泛型集合分别位于System.Collections和System.Collections.Generic两个命名空间下,尝试的过程中发现任何对象的泛型集合都可强制的转换为System.Collections.ICollection这个非泛型集合,可通过遍历此非泛型集合对集合中的每一项进行转换。
class Program
{
static void Main(string[] args)
{
List<子类> pts = new List<子类>();
pts.Add(new 子类() { name = "wq", Sex = "男" });
object listObj = pts;
List<父类> points = PraseList<父类>(listObj);
foreach (var pt in points)
{
pt.name = "改名了呀";
}
}
private static List<T> PraseList<T>(object listObj)
{
List<T> result = new List<T>();
if (!listObj.GetType().IsGenericType)
throw new Exception("非集合类型");
if (listObj as System.Collections.ICollection != null)
{
var list = (System.Collections.ICollection)listObj;
if (list.Count > 0)
{
foreach (var item in list)
{
result.Add((T)item);
}
}
}
return result;
}
}
internal class 父类
{
internal string name
{
set; get;
}
internal string Sex { set; get; }
}
internal class 子类 : 父类
{
internal string age { set; get; }
}