如何将自定义对象强制转换为List <object> </object>

时间:2014-03-20 09:29:52

标签: c# asp.net .net

我有一个父类,其中包含一个包含子类列表的属性。

//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。

全部谢谢!

3 个答案:

答案 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>,您可以添加任何继承抽象类或接口的类型,并将其添加到列表中。

如果您希望对其他对象类型(ClassroomSchool)执行此操作,则不能指望相同的对象可以在列表中捆绑在一起。如果不像这样做一些丑陋的话,你真的不能把它们归还原型:

foreach (object item in list)
{
    if (item.GetType() == typeof(Child)) ...
}

表示该列表中可能包含的每种类型。我也不知道你为什么要这么做的任何好理由。也许你可以进一步详细说明你想要做什么。