2015-01-12 14 views
0

자동 완성을위한 표현식을 작성하여 열거 형에 대한 맵을 작성하는 방법

source.Employee 및 destination.Employee 두 클래스가 있습니다.

내 기능 대상 속성 이름 즉 destination.TestEnum1과 소스 속성 이름 즉 source.TestEnum1에 두 개의 이름 만 표시됩니다.

아래와 같이 동적으로 표현식을 만들고 싶습니다.

var mapExpr = Mapper.CreateMap<Soure.Employee, destination.Employee>().ForMember(destination => destination.TestEnum1, opt => opt.MapFrom(source => (destination.MyEnum2)source.TestEnum1)); 

표현은 내가 프로젝트()에 열거를 매핑을 만드는 오전 단지

destination => destination.TestEnum1, opt => opt.MapFrom(source => (destination.MyEnum2)source.TestEnum1) 

입니다.에();

namespace Soure 
{ 
    public class Employee 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 

     public Department dept1 { get; set; } 

     public int age { get; set; } 

     public MyEnum1 TestEnum1 { get; set; } 
    } 

    public enum MyEnum1 
    { 
     red = 1, 
     yellow = 2 
    } 
} 

대상 직원 클래스 :

namespace destination 
{ 
    public class Employee 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 

     public int age { get; set; } 
     public MyEnum2 TestEnum1 { get; set; } 

     public Departments dept1 { get; set; } 

    } 
    public enum MyEnum2 
    { 
     red = 1, 
     yellow = 2 
    } 
} 
+0

두 부분을 모두 추가했습니다. 실제 원하는지도를 만듭니다. 그러나 심지어 내가 표현을 생성 할 무언가를 얻을지도 모르지만 여전히지도를 만들 수 있습니다. –

+0

정수 값을 기반으로 다른 열거 형간에 동적으로 매핑 할 수있는 사용자 지정 값 해결 프로그램을 만들 수 있습니다. https://automapper.codeplex.com/wikipage?title=Custom%20Value%20Resolvers – Dietz

+0

Queryable Extension에서 @Dietz ValueResolver가 지원되지 않습니다. –

답변

0

당신은 Custom Type Converters를 사용하는 생각

Mapper.CreateMap<Soure.MyEnum1, destination.MyEnum2>() 

매핑 할 수없는 예외를 제공으로 MyEnum2은 (32)가

소스 직원이 int로 이를 위해 here을 찾았습니다. 귀하의 예제에서 enums으로

public class Employee1 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public MyEnum1 TestEnum { get; set; } 
} 

public enum MyEnum1 
{ 
    red = 1, 
    yellow = 2 
} 

public class Employee2 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public MyEnum2 TestEnum { get; set; } 
} 

public enum MyEnum2 
{ 
    red = 1, 
    yellow = 2 
} 

public class Enum1to2TypeConverter : ITypeConverter<MyEnum1, MyEnum2> 
{ 
    public MyEnum2 Convert(ResolutionContext context) 
    { 
     return (MyEnum2)(context.SourceValue); 
    } 
} 

public class Test 
{ 
    public void Example() 
    { 
     Mapper.CreateMap<MyEnum1, MyEnum2>().ConvertUsing(new Enum1to2TypeConverter()); 
     Mapper.CreateMap<Employee1, Employee2>(); 
     Mapper.AssertConfigurationIsValid(); 

     var source = new Employee1 
     { 
      Id = 1, 
      Name = "Employee1-Name", 
      TestEnum = MyEnum1.yellow 
     }; 

     Employee2 result = Mapper.Map<Employee1, Employee2>(source); 
     //Check content of result here! 
    } 
} 

class Program 
{ 
    private static void Main(string[] args) 
    { 
     (new Test()).Example(); 
    } 
} 
+0

코드가 Mapper.Map에서 작동합니다. , IEnumerable > (empList); 내가 쿼리 할 수 ​​empList.Project(). (); 그것은 작동하지 않습니다 –

+0

http : // stackoverflow.com/questions/27854324/how-to-create-for-enum-in-iqueryable-mapping-in-auto-mapper-without-using-fo –

+0

나는 예제를 상세하게 제시했다. 그것을 확인하십시오. 미리 감사드립니다. –

0

가 동일한 기본 int 유형을 공유 automapper : 여기

나는 일반 인터페이스 ITypeConverter에서 상속 나는 Enum1to2TypeConverter을 구현 (조금 단순화) 당신을 위해 샘플 응용 프로그램을 만든 이 작업을 자동으로 처리 할 다음과 같이

Mapper.CreateMap<Foo, Bar>() 
    .ForMember(dest => dest.MyEnum2, opt => opt.MapFrom(src => src.MyEnum1))  
    ; 

    var source = new Foo { MyEnum1 = MyEnum1.yellow }; 

    var destination = Mapper.Map<Bar>(source); 

    Console.WriteLine(destination.MyEnum2); 

Working Fiddle

0

ConvertUsing for LINQ 인 ConvertProjectionUsing을 확인할 수 있습니다.

Mapper.CreateMap<MyEnum1, MyEnum2>().ProjectUsing(src => ???); 

그 안에 무엇을 넣어야합니까? 확실하지는 않습니다. 쿼리 공급자에 따라 달라질 수 있습니다. EF는 그 프로젝션을 가져 와서 SQL로 변환 할 수도,하지 않을 수도 있습니다. 소스를 int로 캐스트 할 수 있습니다.

Mapper.CreateMap<MyEnum1, MyEnum2>().ProjectUsing(src => (MyEnum2)(int)src); 

이것은 쿼리 제공 업체에 완전히 의존합니다.

+0

사실 내 메서드는 private MappingExpression CreateMap () {Mapper.CreateMap ()}을 취하는 제네릭입니다. 주조 방법. ProjectUsing (src => (MyEnum) (int) src) –

+0

CreateMap (). ProjectUsing (src => (TDestination) (int) src); –

+0

나는 그것의 일반적인 방법을 말한다. 만약 내가 TDestination에서 문자열을 얻을. 그러면 예외가 생깁니다. 나는 그것이 효과가 있다는 것을 압니다. 하지만 그것을 위해 별도로 열거 형 케이스를 처리해야합니다. 그리고 저의 마지막 옵션입니다. 나는 모든 것을 다룰 일반 함수 하나를 만들기를 기대하고있다. –