C# 无法将常规列表强制转换为自定义列表类型
我有两门课:C# 无法将常规列表强制转换为自定义列表类型,c#,.net,generics,collections,casting,C#,.net,Generics,Collections,Casting,我有两门课: public class MyClass { public int Foo { get; set; } public string Bar { get; set; } } public class MyList : List<MyClass> { } 代码编译良好,但引发运行时InvalidCastException: 无法将类型为“System.Collections.Generic.List`1[MyClass]”的对象强制转换为类型为“MyLi
public class MyClass
{
public int Foo { get; set; }
public string Bar { get; set; }
}
public class MyList : List<MyClass>
{
}
代码编译良好,但引发运行时InvalidCastException:
无法将类型为“System.Collections.Generic.List`1[MyClass]”的对象强制转换为类型为“MyList”
我不明白为什么会发生这个错误,因为我的列表是一个列表
我发现了一些有关协方差的问题。与我的问题最为相似,但我不知道如何调整答案来解决我的问题
我的问题:
如何用DB记录构建MyList实例
我使用的是C和.NET4.0,每个MyList都是一个列表,但不是每个列表都是MyList。例如,如果您在MyList上有一个自定义属性,Linq的ToList方法将不知道它
您可以使用列表复制构造函数创建新的MyList:
return new MyList(records.Select(x => x.ConvertTo<MyClass>()).ToList());
public class MyList : List<MyClass>
{
public MyList(IEnumerable<MyClass> list)
: base(list)
{
}
}
编辑
正如@ekolis estutely所注意到的,您需要显式继承列表副本构造函数:
return new MyList(records.Select(x => x.ConvertTo<MyClass>()).ToList());
public class MyList : List<MyClass>
{
public MyList(IEnumerable<MyClass> list)
: base(list)
{
}
}
我还会退一步,看看您是否真的需要MyList类,或者您是否可以只使用List,甚至只使用IEnumerable。您可以将派生类强制转换为基类,但您不能以其他方式执行。 如果您有:
public class Base {}
public class Derived : Base {}
可以将“派生”强制转换为“基础”,但不能将“基础”强制转换为“派生”
行得通
但不是
派生类可能比基类拥有更多的信息,这就是为什么
在您的情况下@D Stanley给了您解决方案列表也不会自动列出。你可以创建一个接受列表的构造函数。子类是它的母亲类型,而不是相反。一位母亲可能有很多孩子。CA1002:DonotExposeGenericList-。。。记住这一点。请注意,您实际上需要创建此副本构造函数;它不会从列表继承。MyList类已序列化为XML。我使用它而不是普通列表,因为后者生成一个名为ArrayOfMyClass的XML元素,我希望能够控制XML元素的名称为自定义名称,在本例中为MyList。
Derived d = (Derived)new Base();