簡體   English   中英

字典<string,string> map 到 object 使用 Automapper</string,string>

[英]Dictionary <string,string> map to an object using Automapper

我有一個 class 之類的

public User class
{
 public string Name{get;set;}
 public string Age{get;set;
}

用像這樣的字典

Dictionary<string,string> data= new Dictionary<string,string>(); 
data.Add("Name","Rusi");
data.Add("Age","23");

User user= new User();

現在我想使用Automapper將 map User object 添加到這本dictionary Automapper 映射對象的屬性,但在我的例子中有一個字典和 object。

這如何映射?

AutoMapper 在對象的屬性之間映射,並且不應該在這種情況下運行。 在這種情況下,您需要反射魔法。 您可以通過中間序列化作弊:

var data = new Dictionary<string, string>();
data.Add("Name", "Rusi");
data.Add("Age", "23");
var serializer = new JavaScriptSerializer();
var user = serializer.Deserialize<User>(serializer.Serialize(data));

如果您堅持使用 AutoMapper,您可以例如執行以下操作:

Mapper
    .CreateMap<Dictionary<string, string>, User>()
    .ConvertUsing(x =>
    {
        var serializer = new JavaScriptSerializer();
        return serializer.Deserialize<User>(serializer.Serialize(x));
    });

接着:

var data = new Dictionary<string, string>();
data.Add("Name", "Rusi");
data.Add("Age", "23");
var user = Mapper.Map<Dictionary<string, string>, User>(data);

如果您需要處理帶有子對象的更復雜的對象層次結構,您必須問自己以​​下問題:在這種情況下Dictionary<string, string>是正確的數據結構嗎?

這個線程有點舊,但現在有如何在沒有任何配置的情況下在 automapper 上做到這一點,如官方文檔所述

AutoMapper 可以在沒有任何顯式配置的情況下映射到/從動態對象 (...) 同樣,您可以直接從 Dictionary 映射到對象,AutoMapper 會將鍵與屬性名稱對齊。

更新:

以下代碼顯示了一個工作示例(帶有單元測試)。

void Test()
{
    var mapper = new MapperConfiguration(cfg => { }).CreateMapper();
    var dictionary = new Dictionary<string, object>()
    {
        { "Id", 1 },
        { "Description", "test" }
    };

    var product = mapper.Map<Product>(dictionary);

    Assert.IsNotNull(product);
    Assert.AreEqual(product.Id, 1);
    Assert.AreEqual(product.Description, "test");
}

class Product
{
    public int Id { get; set; }
    public string Description { get; set; }
}

因為我剛剛偶然發現了這個問題,所以我想在當前版本的 AutoMapper 中添加這個答案(即使原始問題已經很老了):

public class MyConfig
{
    public string Foo { get; set; }
    public int Bar { get; set; }
}
var config = new MapperConfiguration(cfg => {});
var mapper = config.CreateMapper();

var source = new Dictionary<string, object>
{
    ["Foo"] = "Hello",
    ["Bar"] = 123
};
var obj = mapper.Map<MyConfig>(source);
obj.Foo == "Hello"; // true

AutoMapper 是一個非常靈活的解決方案。 您可能可以使用自定義映射配置文件來實現這一點,例如:

public class UserMappingProfile : Profile
{
  // Props
  public override string ProfileName { get { return "UserMappingProfile"; } }

  // Methods
  public override void Configure()
  {
    CreateMap<User, Dictionary<string, string>>().ConvertUsing<DictionaryTypeConverter>();
    base.Configure();
  }

  // Types
  internal class DictionaryTypeConverter : ITypeConverter<User, Dictionary<string, string>>
  {
    public User Convert(ResolutionContext context)
    {
      var dict = context.SourceValue as Dictionary<string, string>;
      if (dict == null)
        return null;

      return new User() { Name = dict["Name"], Age = dict["Age"] };
    }
  }
}

有了這個,我可以創建一個映射器的自定義實例:

var config = new Configuration(new TypeMapFactory(), MapperRegistry.AllMappers());
config.AddProfile<UserMappingProfile>();

config.AssertConfigurationIsValid();

var mapper = new MappingEngine(config);

我可能會這樣做:

var dict = new Dictionary<string, string> { { "Name", "Matt" }, { "Age", "27" } };
var user = mapper.Map<User, Dictionary<string, string>>(dict);

更簡單的解決方案。 只需從 KeyValuePair 映射您的對象。 例子:

CreateMap<KeyValuePair<Guid, string>, User>()
            .ForMember(u => u.Id, src => src.MapFrom(x => x.Key))
            .ForMember(u => u.Name, src => src.MapFrom(x => x.Value));

如果您的函數類型是“ ExpandoObject ”,這將起作用。

public EmpClass
{
   public string EmpName { get; set; }
   public int EmpId { get; set; }
}

this.CreateMap<IDictionary<string, object>, EmpClass>()
                .ForMember(dest => dest.EmpName, src => src.MapFrom(x => x["EmpName"]))
                .ForMember(dest => dest.EmpId, src => src.MapFrom(x => x["EmpId"]));

如果有幫助,請告訴我。

顯然最近的 AutoMapper 不適用於 Dictionary<string, string>,必須是沒有定義 map 的 Dictionary<string, object>

在此處輸入圖像描述

必須是沒有CreateMap 的 Dictionary<string, object >

在此處輸入圖像描述

暫無
暫無

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

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