2012-01-24 13 views
2

私のオブジェクトが実装できる複数のインターフェイスがあります。同じメソッド名を使用しながら、ある拡張メソッドを別のメソッドに「カスケード」する方法があるのだろうかと思います。私はこのすべて間違っを見ていますが、ここでは一例であることがあります。複数のインターフェイスのカスケード拡張メソッド?

public interface IBaseDto 
{ 
    int Id {get;set;} 
    string CreatedByFullName {get;set;} 
} 

public interface IDocumentDto 
{ 
    List<ContactDto> Subscriptions {get;set;} 
} 

public class ContactDto: IBaseDto 
{ 
    public int Id {get;set;} 
    public string CreatedByFullName {get;set;} 
    public string FirstName {get; set} 
    public string LastName {get;set;} 
} 

public class MeetingDto: IDocumentDto 
{ 
    public int Id {get;set;} 
    public string CreatedByFullName {get;set;} 
    public List<ContactDto> Subscriptions {get;set;} 
} 

それでは、私は拡張メソッドを使用してエンティティへのDTOを変換したいとしましょう。例はMeetingDto.ToEntity()です。 の拡張メソッドの一部、IDocumentDtoの拡張メソッドを記述して、それぞれ固有のプロパティの具体的な実装について記述できるかどうかを考えようとしています。 MeetingDto.ToEntity()と呼ぶと、最初に会議の延長方法に当たってIDocumentDtoバージョンを呼び出し、必要な情報を入力してから、IDocumentDtoIBaseDtoとなります。私はこれが理にかなってほしい。

UPDATE:

私はこの思い付いたし、それはかなりうまく機能:

public static TBaseDto ToEntity<TBridgeDto>(this TBaseDto dto) where TBaseDto: IBaseDto 
     { 
...    
return dto; 
     } 


     public static TDocumentDto ToEntity<TDocumentDto>(this TDocumentDto dto, IDocumentDto currentDto) where TDocumentDto : IDocumentDto 
     { 
...    
return dto.ToEntity(); 
     } 

     public static MeetingDto ToEntity(this RfiDto dto) 
     { 
...    
return dto.ToEntity(dto) 

     } 
+0

なぜ拡張メソッドを使用しますか? 'ToEntity()'メソッドが他のところで定義されているので、あなたのDTOがよりクリーンであると思いますか? IBaseDTOのToEntity()メソッドがそれぞれの子クラスによってオーバーライドされることが理想的であることを示唆しているようです。ちなみに、MeetingDtoはIBaseDTOも継承する必要がありますか? – perfectionist

+0

automapperはあなたの友人かもしれません。 –

+0

@ DanielA.White、私は私のDTOを生成するためにAutomapperを使用していますが、DTOからEntitiesに行くのは問題です。加えて、私たちが行っているマッピングプロパティの外にいくつかのものがあります。 – DDiVita

答えて

1

+0

私が思いついたのと非常に似ています。ニース! – DDiVita

+0

Cool。あなたが喜んでそれを好きです。 – Sorax

-1

拡張メソッドは静的であり、そのように彼らは、継承を使用してオーバーライドすることはできません。

すべての要素に適用したい場合は、両方のインターフェイスでToEntityメソッドと3番目のインターフェイスを実装してみませんか?

これらのクラスを変更できない場合は、IConvererインターフェイスに似たものを検討してください。何かを取るメソッドとのインタフェースを持ち、エンティティを返します。 (これは汎用である可能性があります)。拡張メソッドと同じように、これらの型をそれぞれエンティティに変換するコードを分離する方法です。

1

はい、あなたが.....ちょうどあなたがしたいインターフェイスにキャストすることができます...このよう

例えば

interface I1 
    { 
     int Id { get; set; } 
    } 

    public interface I2 
    { 
     string Name { get; set; } 
    } 

    public class Blah : I1, I2 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 

    static class ExtendIt 
    { 
     public static void ToEntity(this I1 x) 
     { 
      x.Id = 1; 
     } 

     public static void ToEntity(this I2 x) 
     { 
      x.Name = "hello"; 
     } 

     public static void ToEntity(this Blah x) 
     { 
      (x as I1).ToEntity(); 
      (x as I2).ToEntity(); 
     } 


    }