C# 强制转换和合并两个相同接口但不同类型的列表

C# 强制转换和合并两个相同接口但不同类型的列表,c#,entity-framework,interface,casting,C#,Entity Framework,Interface,Casting,我得到了两个使用相同接口的实体。我想将从实体框架获得的两个结果合并到一个IKurs: public async Task<IEnumerable<IKurs<ITeacherToCourse<IAdditionalTeacherData>, IAdditionalTeacherData>>> GetCourses(bool takeXtr) { IEnumerable<IKurs<ITeacherToCourse<IAdd

我得到了两个使用相同接口的实体。我想将从实体框架获得的两个结果合并到一个
IKurs

public async Task<IEnumerable<IKurs<ITeacherToCourse<IAdditionalTeacherData>, IAdditionalTeacherData>>> GetCourses(bool takeXtr)
{
    IEnumerable<IKurs<ITeacherToCourse<IAdditionalTeacherData>, IAdditionalTeacherData>> result  = new List<IKurs<ITeacherToCourse<IAdditionalTeacherData>, IAdditionalTeacherData>>();
    if (takeXtr)
        using (var context = new Context())
        {
            var courses = context.XtrCourses.Include(x=>x.TeachersToCourses).Where(_someCourseFilterForAgs);
            result.Concat(await courses.ToListAsync()).Cast<IKurs<ITeacherToCourse<IAdditionalTeacherData>, IAdditionalTeacherData>>();
        }

    using (var context = new Context())
    {
        var courses = context.AgsCourses.Include(x=>x.TeachersToCourses).Where(_someCourseFilterForAgs);
        result.Concat(await courses.ToListAsync()).Cast<IKurs<ITeacherToCourse<IAdditionalTeacherData>, IAdditionalTeacherData>>();
    }
    return result;
}
agsteachertocurse
xtrtachertocurse
都实现
iteachertocurse
agsteachertocurse
xtrtachertocurse
都实现
iteachertocurse

如何将它们合并到一个列表中


实际上,两个课程列表都来自不同的背景。这就是为什么我在
GetCourses()
中两次启动上下文。

不需要强制转换,您可以将任何
ikur
添加到列表中

    interface IMyclass{}

    class MyType1 : IMyclass {}

    class MyType2 : IMyclass {}

    public class SomeClass
    {
        private List<IMyclass> MyList = new List<IMyclass>();

        public void DoSomething()
        {
            MyList.AddRange(new List<IMyclass> { new MyType1(), new MyType1() });
            MyList.AddRange(new List<IMyclass> { new MyType2(), new MyType2() });
        }
    }
接口IMyclass{}
类MyType1:IMyclass{}
类MyType2:IMyclass{}
公共类
{
私有列表MyList=新列表();
公共无效剂量测定法()
{
AddRange(新列表{new MyType1(),new MyType1()});
AddRange(新列表{new MyType2(),new MyType2()});
}
}

主要问题之一是

interface ITeacherToCourse<T> where T : IAdditionalTeacherData
{
    int Nr { get; set; }
    T AdditionalTeacherData { get; set; }
}

class XtrTeacherToCourse : ITeacherToCourse<XtrAdditionalTeacherData>
{
    public int Nr { get; set; }
    public XtrAdditionalTeacherData AdditionalTeacherData { get; set; }
}

class AgsTeacherToCourse : ITeacherToCourse<AgsAdditionalTeacherData>
{
    public int Nr { get; set; }
    public AgsAdditionalTeacherData AdditionalTeacherData { get; set; }
}
如果您不想设置
AdditionalTeacherData
属性,那么您可以声明如下接口

interface ITeacherToCourse<out T> where T : IAdditionalTeacherData
{
    int Nr { get; set; }
    T AdditionalTeacherData { get; }
}
对于集合,它是相同的

总接口声明

interface IAdditionalTeacherData
{

}

interface ITeacherToCourse<out T> where T : IAdditionalTeacherData
{
    int Nr { get; set; }
    T AdditionalTeacherData { get; }
}

interface IKurs<out TTeacherToCourse, out TAdditionalTeacherData>
    where TTeacherToCourse : ITeacherToCourse<TAdditionalTeacherData>
    where TAdditionalTeacherData : IAdditionalTeacherData
{
    int Nr { get; set; }
    IEnumerable<TTeacherToCourse> TeachersToCourses { get; }
}
接口IAdditionalTeacherData
{
}
接口ITeacherTourCourse,其中T:IAdditionalTeacherData
{
int Nr{get;set;}
T额外的教师数据{get;}
}
接口IKurs
TTeachertocurse的位置:ITeachertocurse
其中TadeditionalTeacherData:IAdeditionalTeacherData
{
int Nr{get;set;}
IEnumerable TeachersToCourses{get;}
}
以及实现类

class XtrAdditionalTeacherData : IAdditionalTeacherData
{

}

class XtrTeacherToCourse : ITeacherToCourse<XtrAdditionalTeacherData>
{
    public int Nr { get; set; }
    public XtrAdditionalTeacherData AdditionalTeacherData { get; set; }
}

class XtrCourse : IKurs<XtrTeacherToCourse, XtrAdditionalTeacherData>
{
    public int Nr { get; set; }
    public ICollection<XtrTeacherToCourse> TeachersToCourses { get; set; }
    // explicit implementation
    IEnumerable<XtrTeacherToCourse> IKurs<XtrTeacherToCourse, XtrAdditionalTeacherData>.TeachersToCourses => TeachersToCourses;
}

class AgsAdditionalTeacherData : IAdditionalTeacherData
{

}

class AgsTeacherToCourse : ITeacherToCourse<AgsAdditionalTeacherData>
{
    public int Nr { get; set; }
    public AgsAdditionalTeacherData AdditionalTeacherData { get; set; }
}

class AgsCourse : IKurs<AgsTeacherToCourse, AgsAdditionalTeacherData>
{
    public int Nr { get; set; }
    public ICollection<AgsTeacherToCourse> TeachersToCourses { get; set; }
    // explicit implementation
    IEnumerable<AgsTeacherToCourse> IKurs<AgsTeacherToCourse, AgsAdditionalTeacherData>.TeachersToCourses => TeachersToCourses;
}
class XtraditionalTeacherData:IAditionalTeacherData
{
}
类XtrTeacherToCourse:ITeacherToCourse
{
公共int Nr{get;set;}
public XtraditionalTeacherData AdditionalTeacherData{get;set;}
}
第XTR类课程:IKurs
{
公共int Nr{get;set;}
公共ICollection教师课程{get;set;}
//显式实现
IEnumerable IKurs.TeachersToCourses=>teacherstourses;
}
类别AgsAdditionalTeacherData:IAdditionalTeacherData
{
}
AgsTeacherToCourse类课程:ItacherToCourse
{
公共int Nr{get;set;}
公共AgsAdditionalTeacherData附加TeacherData{get;set;}
}
分类:IKurs
{
公共int Nr{get;set;}
公共ICollection教师课程{get;set;}
//显式实现
IEnumerable IKurs.TeachersToCourses=>teacherstourses;
}
现在我们可以添加实例,而无需任何强制转换

var collection = new List<IKurs<ITeacherToCourse<IAdditionalTeacherData>, IAdditionalTeacherData>>();

collection.Add(new XtrCourse());
collection.Add(new AgsCourse());
var集合=新列表();
添加(新的XtrCourse());
添加(新的agscorse());

尝试使用
result.AddRange(wait courses.ToListAsync())但这让我的编译器大哭:(
参数类型列表不可分配给parametertype IEnumerable
-我想我首先需要转换完整的结构,然后?@MatthiasBurger您的类型一定有问题。我必须承认我对您复杂的类型定义感到困惑,但只要您从编译器中获得此错误,转换将无法工作。错误基本上告诉您,强制转换将不起作用。我仍然不知道确切原因,但鲁福爵士已经发现了问题。我需要研究为什么需要在我的界面中使用
out
。但谢谢您的帮助:)-是的,结构令人困惑。你是对的-这不是我的数据库设计:DWow.Perfect.
out
就是问题所在。谢谢你的帮助:)
interface IAdditionalTeacherData
{

}

interface ITeacherToCourse<out T> where T : IAdditionalTeacherData
{
    int Nr { get; set; }
    T AdditionalTeacherData { get; }
}

interface IKurs<out TTeacherToCourse, out TAdditionalTeacherData>
    where TTeacherToCourse : ITeacherToCourse<TAdditionalTeacherData>
    where TAdditionalTeacherData : IAdditionalTeacherData
{
    int Nr { get; set; }
    IEnumerable<TTeacherToCourse> TeachersToCourses { get; }
}
class XtrAdditionalTeacherData : IAdditionalTeacherData
{

}

class XtrTeacherToCourse : ITeacherToCourse<XtrAdditionalTeacherData>
{
    public int Nr { get; set; }
    public XtrAdditionalTeacherData AdditionalTeacherData { get; set; }
}

class XtrCourse : IKurs<XtrTeacherToCourse, XtrAdditionalTeacherData>
{
    public int Nr { get; set; }
    public ICollection<XtrTeacherToCourse> TeachersToCourses { get; set; }
    // explicit implementation
    IEnumerable<XtrTeacherToCourse> IKurs<XtrTeacherToCourse, XtrAdditionalTeacherData>.TeachersToCourses => TeachersToCourses;
}

class AgsAdditionalTeacherData : IAdditionalTeacherData
{

}

class AgsTeacherToCourse : ITeacherToCourse<AgsAdditionalTeacherData>
{
    public int Nr { get; set; }
    public AgsAdditionalTeacherData AdditionalTeacherData { get; set; }
}

class AgsCourse : IKurs<AgsTeacherToCourse, AgsAdditionalTeacherData>
{
    public int Nr { get; set; }
    public ICollection<AgsTeacherToCourse> TeachersToCourses { get; set; }
    // explicit implementation
    IEnumerable<AgsTeacherToCourse> IKurs<AgsTeacherToCourse, AgsAdditionalTeacherData>.TeachersToCourses => TeachersToCourses;
}
var collection = new List<IKurs<ITeacherToCourse<IAdditionalTeacherData>, IAdditionalTeacherData>>();

collection.Add(new XtrCourse());
collection.Add(new AgsCourse());