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());