C# 4.0 自动映射投影和枚举>;串转换器

C# 4.0 自动映射投影和枚举>;串转换器,c#-4.0,automapper,C# 4.0,Automapper,使用Automapper的Project().To方法时出现问题,该方法在执行简单的Mapper.Map()时不显示 我有一个映射到字符串的枚举,还有一个包含该枚举的类,该类映射到另一个包含与枚举属性同名的字符串属性的类 当我从一个类到另一个类执行一个简单的Mapper.Map()时,一切正常。但当我尝试执行项目().to()时,我遇到了一个例外: System.ArgumentException: Type 'System.String' does not have a default con

使用Automapper的
Project().To
方法时出现问题,该方法在执行简单的
Mapper.Map()
时不显示

我有一个映射到字符串的枚举,还有一个包含该枚举的类,该类映射到另一个包含与枚举属性同名的字符串属性的类

当我从一个类到另一个类执行一个简单的
Mapper.Map()
时,一切正常。但当我尝试执行
项目().to()
时,我遇到了一个例外:

System.ArgumentException: Type 'System.String' does not have a default construct
or
   at System.Linq.Expressions.Expression.New(Type type)
   at AutoMapper.MappingEngine.CreateMapExpression(Type typeIn, Type typeOut)
   at AutoMapper.MappingEngine.CreateMapExpression(Type typeIn, Type typeOut)
   at AutoMapper.MappingEngine.<CreateMapExpression>b__9[TSource,TDestination](T
ypePair tp)
   at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Fu
nc`2 valueFactory)
   at AutoMapper.MappingEngine.CreateMapExpression[TSource,TDestination]()
   at AutoMapper.QueryableExtensions.ProjectionExpression`1.To[TResult]()
   at ConsoleApplication1.Program.Main(String[] args) 
System.ArgumentException:类型“System.String”没有默认构造
或
at System.Linq.Expressions.Expression.New(类型)
在AutoMapper.MappingEngine.CreateMapExpression(键入typeIn,键入typeOut)
在AutoMapper.MappingEngine.CreateMapExpression(键入typeIn,键入typeOut)
在AutoMapper.MappingEngine.b__9[T源,TDestination](T
(对)
在System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey,Fu
nc`2(工厂)
在AutoMapper.MappingEngine.CreateMapExpression[TSource,TDestination]()
在AutoMapper.QueryableExtensions.ProjectionExpression`1.To[TResult]()
在控制台application1.Program.Main(字符串[]args)
下面是一个演示问题的代码示例:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;

using AutoMapper.QueryableExtensions;

namespace ConsoleApplication1
{
    public static class EnumExtensions
    {
        public static string DisplayName(this Enum e)
        {
            var field = e.GetType().GetField(e.ToString());
            if (field != null)
            {
                var display = ((DisplayAttribute[])field.GetCustomAttributes(typeof(DisplayAttribute), false)).FirstOrDefault();
                if (display != null)
                {
                    return display.Name;
                }
            }
            return e.ToString();
        }
    }

    public enum Foo
    {
        [Display(Name = "Thing 1")]
        Thing1,
        [Display(Name = "Thing 2")]
        Thing2
    }

    public class Bar
    {
        public Foo SomeFoo { get; set; }
        public string Name { get; set; }
    }

    public class BarViewModel
    {
        public string SomeFoo { get; set; }
        public string Name { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                // map from enum value to enum display name
                AutoMapper.Mapper.CreateMap<Foo, string>().ConvertUsing(x => x.DisplayName());
                AutoMapper.Mapper.CreateMap<Bar, BarViewModel>();
                AutoMapper.Mapper.AssertConfigurationIsValid();


                List<Bar> bars = new List<Bar>();
                bars.Add(new Bar() { Name = "Name1", SomeFoo = Foo.Thing2 });
                bars.Add(new Bar() { Name = "Name2", SomeFoo = Foo.Thing1 });


                var barsQuery = (from Bar b in bars
                                 select b).AsQueryable();

                // works exactly as expected
                var barViewModesls1 = AutoMapper.Mapper.Map<IEnumerable<BarViewModel>>(barsQuery).ToList();

                // throws an exception "Type 'System.String' does not have a default constructor"
                var barViewModels2 = barsQuery.Project().To<BarViewModel>().ToList();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }

            Console.WriteLine("press a key to continue");
            Console.ReadKey();
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.ComponentModel.DataAnnotations;
使用System.Linq;
使用AutoMapper.QueryableExtensions;
命名空间控制台应用程序1
{
公共静态类枚举扩展
{
公共静态字符串DisplayName(此枚举e)
{
var-field=e.GetType().GetField(e.ToString());
如果(字段!=null)
{
var display=((DisplayAttribute[])field.GetCustomAttributes(typeof(DisplayAttribute),false)).FirstOrDefault();
如果(显示!=null)
{
返回显示名称;
}
}
返回e.ToString();
}
}
公众谘询委员会
{
[显示(Name=“Thing 1”)]
事情1,
[显示(Name=“Thing 2”)]
事情2
}
公共类酒吧
{
公共Foo SomeFoo{get;set;}
公共字符串名称{get;set;}
}
公共类BarViewModel
{
公共字符串SomeFoo{get;set;}
公共字符串名称{get;set;}
}
班级计划
{
静态void Main(字符串[]参数)
{
尝试
{
//从枚举值映射到枚举显示名称
AutoMapper.Mapper.CreateMap().ConvertUsing(x=>x.DisplayName());
AutoMapper.Mapper.CreateMap();
AutoMapper.Mapper.AssertConfiguration验证();
列表栏=新列表();
添加(newbar(){Name=“Name1”,SomeFoo=Foo.Thing2});
添加(newbar(){Name=“Name2”,SomeFoo=Foo.Thing1});
var barsQuery=(从条形图中的条形图b开始)
选择b).AsQueryable();
//工作完全符合预期
var barViewModesls1=AutoMapper.Mapper.Map(barsQuery.ToList();
//引发异常“类型”System.String“没有默认构造函数”
var barViewModels2=barsqery.Project().To().ToList();
}
捕获(例外情况除外)
{
Console.WriteLine(例如ToString());
}
Console.WriteLine(“按键继续”);
Console.ReadKey();
}
}
}

这是什么编程语言?抱歉,它是c#,我添加了一个标签来澄清它对您没有帮助,但我已经在AutoMapper 2.2.1以及3.0.0预发行版中重新创建了它
Foo->Foo
起作用,
Foo->string
不起作用,
string->Foo
也不起作用。我建议把它作为一个问题提出来。我还注意到你在他们的邮件列表上问了这个问题,这是个好主意——他们在那里非常活跃。你找到解决这个问题的方法了吗?没有,我没有直接找到解决方法。在我的例子中,我希望字符串转换用于在UI中显示。我没有通过AutoMapper将枚举转换为字符串,而是使用MVC显示和编辑器模板在UI上进行转换,这对我来说已经足够好了。