gpt4 book ai didi

c# - 转换并合并两个相同接口(interface)但不同类型的列表

转载 作者:行者123 更新时间:2023-11-30 23:11:41 34 4
gpt4 key购买 nike

我得到了两个使用相同界面的实体。我想将从 Entity Framework 获得的两个结果合并到一个列表 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;
}

如您所见,我尝试将它们都与 .Cast<IKurs<ITeacherToCourse<IAdditionalTeacherData>, IAdditionalTeacherData>>() (抛出 InvalidCastException)

这些是我的 Course类,都实现了 IKurs<T1<T2>, T1>但它们的 T1 和 T2 不同(但它们仍然使用相同的接口(interface)):

public class XtrCourse : Core_Xtr_Course, IKurs<XtrTeacherToCourse, XtrAdditionalTeacherData>
{
public int Nr { get; set; }
// properties

public ICollection<XtrTeacherToCourse> TeachersToCourses { get; set; }
}

public class AgsCourse : Core_Ags_Course, IKurs<AgsTeacherToCourse, AgsAdditionalTeacherData>
{
public int Nr { get; set; }
// properties

public ICollection<AgsTeacherToCourse> TeachersToCourses { get; set; }
}

public interface IKurs<TTeacherToCourse, TAdditionalTeacherData>
where TTeacherToCourse : ITeacherToCourse<TAdditionalTeacherData>
where TAdditionalTeacherData: IAdditionalTeacherData
{
int Nr { get; set; }

ICollection<TTeacherToCourse> TeachersToCourses { get; set; }
}

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

public interface IAdditionalTeacherData
{
// properties
}

类(class) AgsTeacherToCourseXtrTeacherToCourse两者都实现 ITeacherToCourse类(class) AgsTeacherToCourseXtrTeacherToCourse两者都实现 ITeacherToCourse

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

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

最佳答案

主要问题之一是

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; }
}

接口(interface)协定定义您只能设置一个值给 XtrAdditionalTeacherData 类型的 AdditionalTeacherData for XtrAdditionalTeacherDataAgsAdditionalTeacherData 用于 AgsTeacherToCourse

当我们能够做到时,我们如何才能确保这份契约(Contract)

ITeacherToCourse<IAdditionalTeacherData> ttc = new XtrTeacherToCourse();
ttc.AdditionalTeacherData = new AgsAdditionalTeacherData();

如果您不想设置 AdditionalTeacherData 属性,那么您可以像这样声明接口(interface)

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

AdditionalTeacherData 现在是readonly 并且T 是一个out T

现在我们可以

ITeacherToCourse<IAdditionalTeacherData> ttc; 
ttc = new XtrTeacherToCourse();
ttc = new AgsTeacherToCourse();

集合也是一样。

总接口(interface)声明

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

关于c# - 转换并合并两个相同接口(interface)但不同类型的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44583461/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com