2016-06-13 6 views
0

これは私のモデル階層構造である:は矛盾するプロパティ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パラメータ名:interfaceType

スタック:

AutoMapper.Internal.ProxyGeneratorで

CreateProxyType(タイプInterfaceTypeは)

AutoMapper.Internal.ProxyGeneratorで。 AutoMapper.MappingEngineでGetProxyType(タイプInterfaceTypeは)

CreateObject(ResolutionContextコンテキスト)

答えて

0

インターフェイスに同じ名前の2つのメンバーがあるプロキシ実装を作成すると、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; } 
     } 
    } 
} 

魔法と完全に明示し、明らかに!

関連する問題