2013-07-10 176 views
2

我試圖將實體映射到枚舉。當我正在尋找一個來源時,我發現:Automapper - 將實體映射到枚舉

using Should; 

public enum OrderStatus : short 
{ 
    InProgress = 0, 
Complete = 1 
} 

public enum OrderStatusDto 
{ 
    InProgress = 0, 
Complete = 1 
} 

[Test] 
public void Example() 
{ 
    Mapper.Map<OrderStatus, OrderStatusDto>(OrderStatus.InProgress) 
       .ShouldEqual(OrderStatusDto.InProgress); 
    Mapper.Map<OrderStatus, short>(OrderStatus.Complete).ShouldEqual((short)1); 
    Mapper.Map<OrderStatus, string>(OrderStatus.Complete).ShouldEqual("Complete"); 
    Mapper.Map<short, OrderStatus>(1).ShouldEqual(OrderStatus.Complete); 
    Mapper.Map<string, OrderStatus>("Complete").ShouldEqual(OrderStatus.Complete); 
} 

但我認爲這隻適用於enum-to-enum映射。因爲當我嘗試使用.ShouldEqual時,智能感知無法找到它。在那個代碼塊中,有一個名爲的引用,應該是,但我無法在任何地方找到它的引用。

有關如何使用automapper在枚舉和實體/類之間進行映射的任何想法? 有關使用Should的任何想法?

@我更新了問題,因爲沒有看到實際的代碼,很難考慮解決方案。這裏是代碼片段,可能需要:

public class ParameterEnum 
{ 
/// <summary> 
/// Enum Sayisi: 2650, Son Guncelleme Tarihi: 21.2.2013 09:40:37 
/// </summary> 
public enum Parameters : int 
{ 
... 
IsEmriTuruIsTalebi = 138, 
<summary> 
Adi: Kalite Öneri; ID: 2218; Seviyesi: 3; Aciklamasi: ; Aktif Mi: True 
</summary> 
...}} 

的,這纔是正常的映射完成:

    isEmriEntity.IsEmriTuruId = (int)ParameterEnum.Parameters.IsEmriTuruIsTalebi; 
+0

'ShouldEqual'是演示此功能的測試的一部分。它不是AutoMapper的一部分,你不需要它。 –

+0

然後**。ForMember **方法也適用於這一個? –

回答

2

你應該看看ITypeConverter。這樣的事情應該做的工作:

Mapper.CreateMap<OrderStatus, OrderStatusDto>().ConvertUsing(new OrderStatusConverter()); 

和你的轉換器看起來像這樣:

public class OrderStatusConverter: ITypeConverter<OrderStatus, OrderStatusDto> 
{ 
    public OrderStatusDto Convert(OrderStatus source) 
    { 
     return (OrderStatusDto)source; 
    } 
} 

這應該是足夠採用同樣的方法來任何其他跨類型映射在你的DTO。

編輯:

在您的枚舉轉換錯誤,以此作爲清晰的例子(一個枚舉不是DTO):

public enum ExampleEnum : short 
    { 
     SomeValue, 
     SomeOtherValue, 
     BigValue = 100, 
    } 

    public enum AnotherEnum 
    { 
     Foo, 
     Bar, 
    } 

這應該使枚舉轉換更清晰(不完全轉換爲int)。

private void Test() 
    { 
     // Casting to int only works when the value is 0 

     // This works (SomeValue = 0) 
     AnotherEnum example = (int) ExampleEnum.SomeValue; 

     // This won't even compile (SomeOtherValue = 1) 
     AnotherEnum example2 = (int) ExampleEnum.SomeOtherValue; 

     // Casting to another enum works fine 
     AnotherEnum example2 = (AnotherEnum) ExampleEnum.SomeOtherValue; 

     // Just be careful of values that don't exist in the target enum 
     // This will compile even though it won't work at run-time (BigValue = 100) 
     AnotherEnum example2 = (AnotherEnum) ExampleEnum.BigValue; 
    } 
+1

謝謝。整體投射是錯誤的。我現在已經可以方便地使用VisualStudio,因此能夠在瀏覽器中檢查而不是隻是「編碼」。希望現在答案更清楚。 – nathanchere