首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有动态类型的AutoMapper :缺少类型映射配置或不支持的映射

具有动态类型的AutoMapper :缺少类型映射配置或不支持的映射
EN

Stack Overflow用户
提问于 2016-04-20 13:43:17
回答 3查看 6.2K关注 0票数 1

答:必须将CreateMissingTypeMaps设置为true才能使动态映射工作。

代码语言:javascript
运行
复制
    public IEnumerable<T> GetDummies<T>(IEnumerable<dynamic> dummies)
    {
        var config =
            new MapperConfiguration(c => { c.CreateMissingTypeMaps = true; });

        IMapper mapper = config.CreateMapper();
        return dummies.Select(mapper.Map<T>).ToList();
    }

我在实体框架()周围有包装器来执行对数据库的查询。我希望允许用户只选择必需的属性,但保留实体类型的结果。

这是虚拟代码(不使用EF,但有相同的问题)

代码语言:javascript
运行
复制
class Program
{
    static void Main(string[] args)
    {
        var dummies = new[]
        {
            new DummyContainer
            {
                Name = "First",
                Description = "First dummy",
                DummyNumbers = new List<int> { 1, 2, 3 },
                Foo = new FooThingy { Title = "Foo thingy" }
            }
        };

        var smallDummies = dummies.Select(d => new { d.Name }).ToList();
        List<DummyContainer> fullDummies = smallDummies.Select(Mapper.Map<DummyContainer>).ToList();

        Debugger.Break();
    }
}

class DummyContainer
{
    public string Name { get; set; }
    public string Description { get; set; }
    public ICollection<int> DummyNumbers { get; set; }
    public FooThingy Foo { get; set; }
}

class FooThingy
{
    public string Title { get; set; }
}

得到这个异常:

代码语言:javascript
运行
复制
Missing type map configuration or unsupported mapping.

Mapping types:
<>f__AnonymousType0`1 -> DummyContainer
<>f__AnonymousType0`1[[System.String, mscorlib, Version=4.0.0.0,  Culture=neutral, PublicKeyToken=b77a5c561934e089]] -> AutoMapperWithGenerics.DummyContainer

Destination path:
DummyContainer

Source value:
{ Name = First }

我被困在这里了,因为文档声明AutoMapper使用属性名来映射回对象:动态与ExpandoObject映射

请注意,上面的代码就是例子。在我的应用程序中,事情变得有点疯狂,因为我实际上是在使用泛型。

代码语言:javascript
运行
复制
Mapper.Map<TEntity>

..。它应该保持这种状态--我不知道使用的是哪种实体类型。我的期望是:将属性映射到现有类型,如果缺少,则设置default(T)

编辑:我尝试从dynamicT指定映射程序,这里几乎是完整的代码:

代码语言:javascript
运行
复制
class Program
{
    static void Main(string[] args)
    {
        // ...

        var dumminator = new DummyService();
        IEnumerable<DummyContainer> bigDummies = dumminator.GetDummies<DummyContainer>(smallDummies);

        Debugger.Break();
    }
}

class DummyService
{
    public IEnumerable<T> GetDummies<T>(IEnumerable<dynamic> dummies)
    {
        var config = new MapperConfiguration(c => c.CreateMap<dynamic, T>());
        IMapper mapper = config.CreateMapper();

        return dummies.Select(mapper.Map<T>).ToList();
    }
}

..。这不会在异常情况下消失,但是结果是非常空的(所有属性都有default值。

EN

Stack Overflow用户

回答已采纳

发布于 2016-04-20 13:57:37

您需要使用Mapper.DynamicMap<T>而不是Mapper.Map<T>从动态或匿名类映射。

代码语言:javascript
运行
复制
List<DummyContainer> fullDummies = smallDummies.Select(Mapper.DynamicMap<DummyContainer>).ToList();
票数 1
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36745756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档