【发布时间】:2021-07-09 23:53:05
【问题描述】:
我知道此请求的反模式性质,但也许有更好的选择。
简介
我有List<IBaseEntity> 并想转换为List<ActualEntity>。尽管 ActualEntity 需要来自对 IBaseEntity 实际情况的反映。它是 50 多个潜在类别之一
所以是这样的:
public void Install(List<IBaseEntity> list)
{
var type = list.First().GetType();
var typedList = list.Cast<?>(?).ToList()
ThirdPartyClass.Install( typedList )
}
只是不确定如何将type 放入Cast
原因详情
Install 方法必须是具体类型,因为第 3 方组件使用该类型链接到 EF 中的 DbSet。所以 BaseEntity 的列表不起作用。它抛出一个关于找不到DbSet<IBaseEntity> 的异常。必须是DbSet<ConcreteClass>
我保证 IBaseEntity 将始终是同一个具体类,但应用程序中的每个实体都会多次调用该方法。因此,通过指定每种具体类型来进行通常的转换是不切实际的。
EF 可以通过添加 DbContext.AddRange(list) 来确定 IBaseEntity 的实际含义并使用正确的映射。
提前致谢
** 更新 ** 有人建议调用方法会知道类型,不幸的是它有点复杂,所以让我解释一下。
有一个BaseSampleData<TEntity> : ISampleDataBuilder 类处理创建示例数据,它维护其他实体的主键列表等。
现在的症结是组装它们的工厂
public class ProjectASampleDataFactory
{
public class List<ISampleDataBuilder> GetBuilders(){
return new List<ISampleDataBuilder> {
new UserSampleData(), // ISampleDataBuilder<User>
new BlogsSampleData(), // ISampleDataBuilder<Blogs>
etc...
}
}
}
问题是我需要一个 List
所以我得到了一个每个实体都遵循的列表,但是虽然它是一个列表,但我们只是不知道它是哪个 ActualEntity。
【问题讨论】:
-
像
public void Install<T>(List<IBaseEntity> list) where T : IBaseEntity这样的东西能在这里工作吗? -
@stuartd 我认为重点是
ThirdPartyClass.Install有一个List<ActualEntity>作为参数。 -
是的@Dominik,但这是否意味着在将参数传递给第三方之前可以调用
Cast<T>()? -
Install is List
但 T 需要是 ActualClass (与 DbSet 相同我无法控制此方法。MyListOfIBaseEntity.First().GetType() 不知何故需要被送入演员阵容的 -
stackoverflow.com/questions/232535/… 是答案......有人甚至可以写出如何为你打电话给
Cast<T>......我也不会指望那个。