簡體   English   中英

AutoMapper - 使用相同的源和目標對象類型映射

[英]AutoMapper - Map using the same source and destination object types

我正在使用Automapper來獲取兩個相同類型的對象,並映射已更改的任何新值。 我嘗試使用下面的代碼,但它不斷拋出錯誤,我甚至不確定這是否可以通過Automapper實現。

例如:

        Mapper.CreateMap<UserDetails, UserDetails>();
        UserDetails userDetails = Mapper.Map<UserDetails, UserDetails>(userDetailsCurrent, userDetailsNew);

基本上,我需要將從新對象“userDetailsNew”進入的任何新值復制到現有對象“userDetailsCurrent” - 即使它們屬於同一類型。 這樣我就可以用新值“更新”現有對象。 我這樣做的原因是因為我不確定將傳遞哪些用戶詳細信息 - 我需要在它們到達時映射它們。

我通常使用Automapper來映射具有相似屬性的不同對象 - 但我認為我可以使用Automapper的強大功能以這種方式實現相同的功能。 甚至可能有更好的解決方案 - 任何幫助將不勝感激!

這似乎對我有用。 我的自定義類型:

class MyType
{
    public int MyInt { get; set; }
    public string MyString { get; set; }
}

我的映射代碼:

Mapper.CreateMap<MyType, MyType>();
var source = new MyType() {MyInt = 1, MyString = "Hello world"};
var dest = Mapper.Map<MyType, MyType>(source);

除了簡單屬性之外,您的自定義類型有什么意義?

這可以使用元組和創建從Automapper的Abstract TypeConverter類派生的自定義類型轉換器來完成。

假設您有源和目標類:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public override string ToString()
    {
        return string.Format("Firstname: {0}, Lastname: {1}", FirstName, LastName);
    }
}

然后你可以構建自定義轉換器類型

public class CustomerPersonConverter : TypeConverter<Tuple<Person, Person>, Person>
{
    protected override Person ConvertCore(Tuple<Person, Person> source)
    {
        var orginalValues = source.Item1;
        var updatedValues = source.Item2;

        var result = new Person
            {
                FirstName = string.IsNullOrEmpty(updatedValues.FirstName) ? orginalValues.FirstName : updatedValues.FirstName,
                LastName = string.IsNullOrEmpty(updatedValues.LastName) ? orginalValues.LastName : updatedValues.LastName
            };

        return result;
    }
}

可以像

var orginal = new Person() {FirstName = "Clifford", LastName = "Mayson"};
        var updated = new Person() {FirstName = "Cliff"};

        Mapper.CreateMap<Tuple<Person, Person>, Person>().ConvertUsing<CustomerPersonConverter>();

        var result = Mapper.Map<Person>(new Tuple<Person, Person>(orginal, updated));

        Console.WriteLine(result);

這將產生保持原始姓氏值的結果,因為更新中缺少原始姓氏值,但更新名字值,例如。

Firstname: Cliff, Lastname: Mayson

這是Automapper的已知行為( 請參閱問題 )。 你實際上必須告訴Automapper:

 CreateMap<A,A>(); CreateMap<B,B>(); CreateMap<C,C>(); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM