C# 导出IEnumerable<;x>;或IEnumerable<;y>;用同样的方法

C# 导出IEnumerable<;x>;或IEnumerable<;y>;用同样的方法,c#,C#,如果我有两个这样的列表: IEnumerable<Student> students; IEnumerable<Teacher> teachers; i数不清的学生; 数不清的教师; 我还编写了一个方法,将学生列表导出到一个XML文件,并获取 IEnumerable<Student> IEnumerable 作为输入 有没有一种方法可以让我传入列表并让方法导出数据,而不用担心它是学生列表还是教师列表?在学生和教师上都实现一个IPerson接口。然后将X

如果我有两个这样的列表:

IEnumerable<Student> students;
IEnumerable<Teacher> teachers;
i数不清的学生;
数不清的教师;
我还编写了一个方法,将学生列表导出到一个XML文件,并获取

IEnumerable<Student>
IEnumerable
作为输入


有没有一种方法可以让我传入列表并让方法导出数据,而不用担心它是学生列表还是教师列表?

在学生和教师上都实现一个IPerson接口。然后将XML导出方法更改为接受IEnumerable。IPerson接口将具有检索XML导出数据所需的方法。

列表中的每个项都需要知道如何导出它们自己。您需要让每个项实现一个接口,例如
IExportable
,该接口具有
Export
方法。然后可以创建一个方法,例如:

public static void ExportAll(IEnumerable<IExportable> sequence)
{
    //...
}
公共静态void ExportAll(IEnumerable序列)
{
//...
}

然后,您可以传递一个知道如何导出自身的任何类型的列表


IExportable
可能最终成为
ISerializable
,除非您打算使用其他方法导出项。

从基本抽象类继承,非常适合序列化

public abstract class Person
{
    // your code goes here
    // public string FirstName { get; set; }
    // public string LastName { get; set; }
}

public class Student : Person
{
    // your code goes here
}

public class Teacher : Person
{
    // your code goes here
}


public void Export(IEnumerable<Person> persons)
{
    // your code goes here
}
公共抽象类人物
{
//你的密码在这里
//公共字符串名{get;set;}
//公共字符串LastName{get;set;}
}
公营班级学生:人
{
//你的密码在这里
}
公开课教师:人
{
//你的密码在这里
}
公共出口(IEnumbers)
{
//你的密码在这里
}

student和teacher是从同一基类继承还是实现同一接口?然后,您可以传递知道如何导出自身的任何类型的列表,前提是该类型具有到IExportable的引用转换。如果没有,则必须使用Select进行装箱转换。在这种情况下,我更倾向于
公共静态void ExportAll(IEnumerable序列),其中T:IExportable
不需要协变转换。我已经按照您的建议实现了一个IExportable接口,这是可行的。但在我的OutputFile方法中,我仍然有foreach(顺序中的学生),当它可以是学生或教师时。如何使foreach循环通用?我想我已经解决了-实现了@Wieslaw建议的基类,然后使基类和两个子类实现了您建议的接口。谢谢你给我上了一堂非常好的OO课:)谢谢你的建议-你刚刚错过了被接受的答案,因为我今天从@Servy的帖子中学到了更多。但是我也实现了基类。