gpt4 book ai didi

c# - 如何将 ProjectTo 从基本类型转换为仅在运行时已知的类型?

转载 作者:行者123 更新时间:2023-11-30 18:11:35 24 4
gpt4 key购买 nike

我们正在使用 Entity Framework Core,其中包含一组共享基类的实体。

public class EntityBase { ... }

public class FirstEntityChild : EntityBase { ... }
public class SecondEntityChild : EntityBase { ... }

我们使用它来查询 FirstEntityChildSecondEntityChild 而无需在编译时知道是哪一个。

为了向我们的 View 提供数据,我们有 View 模型。

public class FirstEntityChildViewModel { ... }
public class SecondEntityChildViewModel { ... }

我们希望使用 AutoMapper 的 ProjectTo 将查询结果从我们的数据库实体映射到 View 模型。我们设置了从 FirstEntityChildFirstEntityChildViewModel 以及从 SecondEntityChildSecondEntityChildViewModel 的映射配置文件。我们没有来自 EntityBase 的 map 。

我们目前正在尝试使用扩展方法通过类型推断来完成此任务:

public static IQueryable<TDestination> ProjectTo<TSource, TDestination>(
this IQueryable<TSource> query,
TSource sourceTypeInstance,
TDestination destinationTypeInstance,
IConfigurationProvider configuration)
{
return query.ProjectTo<TDestination>(configuration);
}

我们如下使用它,假设 sourceTypeFirstEntityChildSecondEntityChild,targetType 是 FirstEntityChildViewModel SecondEntityChildViewModel,两者都仅在运行时已知:

var sourceInstance = Activator.CreateInstance(sourceType);
var targetInstance = Activator.CreateInstance(targetType);

var results = await query
.ProjectTo(sourceInstance, targetInstance, mapper.ConfigurationProvider)
.ToListAsync();

我们面临的问题发生在我们的 ProjectTo 扩展中。当我调试并停在该行时,sourceTypeInstancedestinationTypeInstance 在调试器中分别显示为 FirstEntityChildFirstEntityChildViewModel .但是当该行执行时,AutoMapper 尝试从 EntityBase 映射到 object 我们没有对应的映射配置文件(而且我认为甚至不可能):

InvalidOperationException:缺少从 EntityBase 到 System.Object 的映射。使用 Mapper.CreateMap 创建。

是否可以指出 AutoMapper 应该使用的实际派生类型?还是我们此时刚刚遇到泛型的局限性?

最佳答案

您可以使用反射从 ProjectTo 和您的目标类型创建一个通用方法,然后调用该方法来获取 ProjectTo 的结果。例如:

public static IQueryable<TDestination> ProjectTo<TSource, TDestination>(
this IQueryable<TSource> query,
TSource sourceTypeInstance,
TDestination destinationTypeInstance,
IConfigurationProvider configuration)
{
var projectToMethod = typeof(AutoMapper.QueryableExtensions.Extensions)
.GetMethod("ProjectTo", new Type[]
{
typeof(IQueryable),
typeof(IConfigurationProvider),
typeof(IDictionary<string, object>),
typeof(string[])
})
.MakeGenericMethod(typeof(TDestination));
return projectToMethod.Invoke(query, new object[] { query, configuration, new Dictionary<string, object>(), new string[] { } });
}

关于c# - 如何将 ProjectTo 从基本类型转换为仅在运行时已知的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57512250/

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