首页 > 解决方案 > .net 泛型和 AutoMapper 的挑战

问题描述

我下面有一个界面

public interface IEntity<T>
{
     T Id { get; set; }
    DateTime Created { get; set; }
    DateTime Updated { get; set; }
    [Timestamp] byte[] RowVersion { get; set; }

}

这个接口是由一个类实现的

  public partial class UrlRec: IEntity<Int64>
{
    public int EntityId { get; set; } 
    public string EntityName { get; set; }
    public string Slug { get; set; }
    public bool IsActive { get; set; }
    public int LanguageId { get; set; }
    public long Id { get; set; }
    public DateTime Created { get; set; }
    public DateTime Updated { get; set; }
   [Timestamp] public byte[] RowVersion { get; set; }
}

我为 UrlRecModel 类创建了一个 ViewModel。如何使用 AutoMapper 将 ViewModel 的通用扩展方法写入类,反之亦然。

这是我的视图模型

 public partial class UrlRecordModel : BaseIbileHubEntityModel
{
    #region Properties

    [IbileHubResourceDisplayName("Admin.System.SeNames.Name")]
    public string Name { get; set; }

    [IbileHubResourceDisplayName("Admin.System.SeNames.EntityId")]
    public int EntityId { get; set; }

    [IbileHubResourceDisplayName("Admin.System.SeNames.EntityName")]
    public string EntityName { get; set; }

    [IbileHubResourceDisplayName("Admin.System.SeNames.IsActive")]
    public bool IsActive { get; set; }

    [IbileHubResourceDisplayName("Admin.System.SeNames.Language")]
    public string Language { get; set; }

    [IbileHubResourceDisplayName("Admin.System.SeNames.Details")]
    public string DetailsUrl { get; set; }

    #endregion
}

标签: c#.netgenericsautomapperviewmodel

解决方案


我已经创建了这两种扩展方法。

 public static IEntity<T> ToModel<T>(this IEntityViewModel<T> viewModel)
    {
        return (IEntity<T>)Mapper.Map(viewModel, viewModel.GetType(), typeof(IEntity<T>));
    }

    public static IEntityViewModel<T> ToViewModel<T>(this IEntity<T> entity)
    {
        return (IEntityViewModel<T>)Mapper.Map(entity, entity.GetType(), typeof(IEntityViewModel<T>));
    }

我在这里用过。

IEntityViewModel<Int64> entityViewModel = urlRec.ToViewModel<Int64>();
        IEntity<Int64> entity = entityViewModel.ToModel<Int64>();

我不知道您的视图模型看起来如何,所以我创建了一个测试视图模型和界面。

 public interface IEntityViewModel<T>
{
    T Id { get; set; }
    DateTime Created { get; set; }
    DateTime Updated { get; set; }
    byte[] RowVersion { get; set; }

}

public class UrlRecViewModel : IEntityViewModel<Int64>
{
    public int EntityId { get; set; }
    public string EntityName { get; set; }
    public string Slug { get; set; }
    public bool IsActive { get; set; }
    public int LanguageId { get; set; }
    public long Id { get; set; }
    public DateTime Created { get; set; }
    public DateTime Updated { get; set; }
    public byte[] RowVersion { get; set; }
}

推荐阅读