Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将自定义对象强制转换为列表<;对象>;_C#_Asp.net_.net - Fatal编程技术网

C# 如何将自定义对象强制转换为列表<;对象>;

C# 如何将自定义对象强制转换为列表<;对象>;,c#,asp.net,.net,C#,Asp.net,.net,我有一个父类,具有一个包含子类列表的属性 //Parent Class : public class Family { private MemberList _familymember = new MemberList(); public MemberList FamilyMember { get { return _familymember ; } set { _familymember = value; } } } //

我有一个父类,具有一个包含子类列表的属性

//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]'
现在剩下的代码可以正常工作了,我可以像往常一样循环使用IList


谢谢大家

您可以为所有儿童类(成员、教室和状态)添加公共接口,否则
List
List
之间绝对没有连接,因为这将允许以下情况:

List<object> myList = (List<object>) memberTypeList;
myList.Add(5); // oops
List myList=(List)memberTypeList;
我的列表。添加(5);//哎呀

也是:虽然它是不幸的,但是C语言中没有类型的混叠,就像C或C++中的。尽管如此,从类派生看起来像是一种解决方法,但它在语义上是错误的,不应该使用。

您永远不应该继承
列表,而应该声明一个:

public class Family
{
    private List<Member> _familymember = List<Member>();

    public List<Member> FamilyMember
    {
        get { return _familymember ; }
        set { _familymember = value; }
    }

}
这样称呼它:
var list=GetList(memberList).ToList()


这至少可以解决您的编译器错误,但它不会解决此问题中的设计错误。

永远不需要从
列表继承。您可以在这里使用LINQ
.ToList()…为什么somefunction()返回对象?在MemberList中创建一个类似ToObject()的方法。在那里,使用Linq进行转换,比如“returnthis.{选择您想要包含的任何属性或simple ignore select}.ToList();”知道我应该如何编写接口类来链接列表和列表吗?当然,您可以改为链接
List
。谢谢!我已将列表属性更改为使用私有列表,它可以工作!
List<object> myList = (List<object>) memberTypeList;
myList.Add(5); // oops
public class Family
{
    private List<Member> _familymember = List<Member>();

    public List<Member> FamilyMember
    {
        get { return _familymember ; }
        set { _familymember = value; }
    }

}
public static IEnumerable<T> GetList<T>(List<T> source)
{
    return source;
}