【问题标题】:Automapper: how to flat a list of object into a single objectAutomapper:如何将对象列表扁平化为单个对象
【发布时间】:2021-12-01 20:42:13
【问题描述】:

我有这个来自数据库的实体

public class SettingsDb
{
    public int Id { get; set; }
    public string Section { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }
}

意思是:

  • Section:设置的主要部分(例如 FTP)
  • 名称:属性的名称(例如,已启用、服务器等)
  • 值:属性的值(例如,true、“www.server.it”等)

模型/分类它是

public class FtpSettings
{
    public bool Enabled { get; set; }
    public string Server { get; set; }
    public int Port { get; set; }
    public string Protocol { get; set; }
    public string SSLStartMode { get; set; }
    public string User { get; set; }
    public string Password { get; set; }
}

我必须将列表 IList 扁平化为单个模型/dto 对象 FtpSettings(假设它已经从 SQL 查询部分过滤)

我怎样才能做到这一点?

谢谢。

【问题讨论】:

    标签: c# asp.net .net automapper flatten


    【解决方案1】:
    //your model
    public class FtpSettings
    {
        // tle IList that you want
        public IList<SettingsDb> flatIlist {get;set;}
    }
    

    或者您可以像这样直接在您的视图中添加您的 Ilist:

    @model IList<SettingsDb>
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案2】:

    在麻烦之后我做了以下事情。

    转换器

    public static class ConfigConverter<T> where T : class, new()
        {
            public static T GetSettings(IList<SettingsDb> settings)
            {
                var cfg = new MapperConfiguration(cfg =>
                    cfg.CreateMap<IList<SettingsDb>, T>()
                    .ConvertUsing<SettingsTypeConverter<T>>());
    
                var mapper = cfg.CreateMapper();
    
                var ftpSettings = mapper.Map<T>(settings);
    
                return ftpSettings;
            }
        }
    
    
        public class SettingsTypeConverter<T> : ITypeConverter<IList<SettingsDb>, T> where T : class, new()
        {
    
            public T Convert(IList<SettingsDb> source, T destination, ResolutionContext context)
            {
    
                var dto = new T();
    
                foreach (var setting in source)
                {
                    foreach (var dtoProperty in dto.GetType().GetProperties())
                    {
                        if (!setting.Name.Equals(dtoProperty.Name))
                        {
                            continue;
                        }
    
                        var tProp = dtoProperty.PropertyType;
    
                        if (!setting.Value.IsConvertibleTo(tProp))
                        {
                            //error
    
                            continue;
                        }
    
                        dtoProperty.SetValue(dto, setting.Value.To(tProp));
    
                    }
                }
    
                return dto;
    
    
            }
    

    它可以用作

    var ftpSettings = ConfigConverter<FtpSettings>.GetSettings(settingsDb);
    

    必须通过 Nuget 安装 AutoMapper 和 UniversalTypeConverter

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-05
      • 2019-01-10
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 2019-04-23
      相关资源
      最近更新 更多