2016-06-13 27 views
0

這是我的模型層次結構:Automapper接口有衝突的屬性ID參數名:interfaceType

public interface INodeModel<T> : INodeModel 
where T : struct 
{ 
    new T? ID { get; set; } 
} 

public interface INodeModel 
{ 
    object ID { get; set; } 
    string Name { get; set; } 
} 

public class NodeModel<T> : INodeModel<T> 
where T : struct 
{ 
    public T? ID { get; set; } 
    public string Name { get; set; } 

    object INodeModel.ID 
    { 
     get 
     { 
      return ID; 
     } 

     set 
     { 
      ID = value as T?; 
     } 
    } 
} 

public class NodeDto<T> where T : struct 
{ 
    public T? ID { get; set; } 
    public string Name { get; set; } 
} 

,這些都是我的映射和測試:

class Program 
{ 
    private static MapperConfiguration _mapperConfiguration; 

    static void Main(string[] args) 
    { 
     _mapperConfiguration = new MapperConfiguration(cfg => 
     { 

      cfg.CreateMap(typeof(NodeDto<>), typeof(NodeModel<>)); 
      cfg.CreateMap(typeof(NodeDto<>), typeof(INodeModel<>)); 
      cfg.CreateMap(typeof(INodeModel<>), typeof(NodeModel<>)); 

     }); 

     var dto = new NodeDto<int> { ID = 1, Name = "Hi" }; 

     var obj = _mapperConfiguration.CreateMapper().Map<INodeModel<int>>(dto); 


     Console.Write(obj.ID); 
     Console.ReadLine(); 
    } 
} 

這裏是例外:

AutoMapper.AutoMapperMappingException:

映射類型:

NodeDto 1 -> INodeModel 1 NodeDto`1 [[System.Int32] - >

INodeModel`1 [[System.Int32]

消息:

該接口具有一個衝突屬性ID參數名稱:接口類型

堆棧:

at AutoMapper.Internal.ProxyGenerator。 CreateProxyType(Type interfaceType)

at AutoMapper.Internal.ProxyGenerator。 GetProxyType(Type interfaceType)

at AutoMapper.MappingEngine。 CreateObject(ResolutionContext上下文)

回答

0

創建一個代理實現時,如果在接口中有兩個具有相同名稱的成員,AutoMapper會出現混淆。你正在使用陰影,這更加困難。而不是假設AutoMapper可以使這個意義上說,這,好運解釋到一個新的團隊成員,我反而使界面類實現明確的:

cfg.CreateMap(typeof(NodeDto<>), typeof(NodeModel<>)); 
cfg.CreateMap(typeof(NodeDto<>), typeof(INodeModel<>)) 
    .ConvertUsing(typeof(NodeModelConverter<>)); 
cfg.CreateMap(typeof(INodeModel<>), typeof(NodeModel<>)); 

public class NodeModelConverter<T> : 
    ITypeConverter<NodeModel<T>, INodeModel<T>> where T : struct 
{ 
    public INodeModel<T> Convert(NodeModel<T> source, ResolutionContext context) 
     => new NodeModelImpl {ID = source.ID, Name = source.Name}; 

    private class NodeModelImpl : INodeModel<T> 
    { 
     public T? ID { get; set; } 

     public string Name { get; set; } 

     object INodeModel.ID 
     { 
      get { return ID; } 

      set { ID = (T?) value; } 
     } 
    } 
} 

沒有魔術和完全明確,明顯的!