我有一个父类,其中包含一个包含子类列表的属性。
//Parent Class :
public class Family
{
private MemberList _familymember = new MemberList();
public MemberList FamilyMember
{
get { return _familymember ; }
set { _familymember = value; }
}
}
//Children Class :
public class Member
{
private string _name;
public string Name
{
get { return _name; }
set { _name= value; }
}
}
public class MemberList : List<Member>
{
}
//And here is how I use them :
Family myFamily = new Family();
Member dad = new Member();
Member mom = new Member();
//I add the children into the parent property :
myFamily.FamilyMember.Add(dad);
myFamily.FamilyMember.Add(mom);
//I have other different similar parent-children classes, eg : School-Classroom, Country-States and etc.
//In one condition, I need to write a generic class to process the List<custom> type property :
//some function that will return a children list object.
object ChildrenList = somefunction();
List<object> ObjectList = (List<object>)ChildrenList;
//and trying to get the Type name inside the List :
Type ChildrenType = ObjectList.GetType().GetGenericArguments()[0];
//It gives me error :
Unable to cast object of type 'MemberList' to type'System.Collections.Generic.List`1[System.Object]'
//or when I process other types of list
Unable to cast object of type 'ClassroomList' to type 'System.Collections.Generic.List`1[System.Object]'
Unable to cast object of type 'StateList' to type 'System.Collections.Generic.List`1[System.Object]'
我正在尝试编写一个通用类来处理列表,因此我不知道列表属性的类型。知道如何将它们转换成List吗?
所有帮助表示赞赏!!
更新&amp;解决方案:
与建议的aevitas一样,我已将list属性更改为
private List<Member> _familymember = List<Member>();
然后我使用我在其他主题中找到的IList接口
object returnedList = somefunction(); // some function that return a List of object.
IList myList = (IList)returnedList ;
现在剩下的代码工作了,我可以像平常一样遍历IList。
全部谢谢!
答案 0 :(得分:2)
您可以为所有子课程(会员,课堂和州)添加一个公共界面,否则List<object>
和List<MemberType>
之间绝对没有联系,因为这将允许以下内容:
List<object> myList = (List<object>) memberTypeList;
myList.Add(5); // oops
另外:尽管不幸的是,C#中没有类型别名,就像在C或C ++中一样。尽管如此,从一个类派生看起来像是一个变通方法,但它在语义上是错误的,不应该使用。
答案 1 :(得分:1)
你永远不应该继承List<T>
,而应该申报一个:
public class Family
{
private List<Member> _familymember = List<Member>();
public List<Member> FamilyMember
{
get { return _familymember ; }
set { _familymember = value; }
}
}
最重要的是,你永远不应该将你的类型转换为object
,而是使用通用类型或接口作为D.R.建议。
如果您想坚持自己的枪支,并希望将MemberList
对象转换为List<Member>
,则可以这样做:
public static IEnumerable<T> GetList<T>(List<T> source)
{
return source;
}
并称之为:
var list = GetList<Member>(memberList).ToList();
这至少应该解决你的编译器错误,但它不会解决这个错误。
答案 2 :(得分:0)
为所有这些特定类提供一个通常继承的基类。那可能是一个抽象的类:
public abstract class Child
{
public Name { get; set; }
...
}
或使用界面:
public interface IChild
{
public Name { get; set; }
}
使用object
作为共同基础类型是一个可怕的想法,原因在D.R.的答案中说明。使用List<Child>
或List<IChild>
,您可以添加任何继承抽象类或接口的类型,并将其添加到列表中。
如果您希望对其他对象类型(Classroom
和School
)执行此操作,则不能指望相同的对象可以在列表中捆绑在一起。如果不像这样做一些丑陋的话,你真的不能把它们归还原型:
foreach (object item in list)
{
if (item.GetType() == typeof(Child)) ...
}
表示该列表中可能包含的每种类型。我也不知道你为什么要这么做的任何好理由。也许你可以进一步详细说明你想要做什么。