2012-08-26 12 views
6

पर निहित रूप से परिवर्तित नहीं कर सकता है, मुझे यकीन नहीं है कि यह एक कॉन्वर्सिस और कंट्रावायरिस समस्या है लेकिन मुझे यह काम नहीं मिल रहा है।MyType <Foo> को MyType <IFoo>

public interface IDto { } 

public class PaginatedDto<TDto> where TDto : IDto { 

    public int PageIndex { get; set; } 
    public int PageSize { get; set; } 
    public int TotalCount { get; set; } 
    public int TotalPageCount { get; set; } 

    public bool HasNextPage { get; set; } 
    public bool HasPreviousPage { get; set; } 

    public IEnumerable<TDto> Dtos { get; set; } 
} 

public class PersonDto : IDto { 

    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Surname { get; set; } 
    public int Age { get; set; } 
} 

class Program { 

    static void Main(string[] args) { 

     var people = new List<PersonDto> { 
      new PersonDto { }, 
      new PersonDto { }, 
      new PersonDto { }, 
     }; 

     var paginatedPersonDto = new PaginatedDto<PersonDto>() { 
      Dtos = people 
     }; 

     //ProcessDto doesn't accept this 
     ProcessDto(paginatedPersonDto); 
    } 

    private static void ProcessDto(PaginatedDto<IDto> paginatedDto) { 

     //Do work... 
    } 
} 

किसी कारण से मैं ProcessDto विधि के लिए PaginatedDto<IDto> रूप PaginatedDto<PersonDto> पारित नहीं हो सकता,: यहाँ कोड है। कोई विचार मैं इस मुद्दे को कैसे हल कर सकता हूं?

उत्तर

6

हां यह एक भिन्नता मुद्दा है। आप एक इंटरफेस (केवल इंटरफेस और प्रतिनिधियों सह किया जा सकता है/contravariant) IPaginatedDto<out TDto> जहां Dtos एक सेटर नहीं हो सकता है बनाने की जरूरत (अन्यथा आप out उपयोग कर सकते हैं नहीं):

public interface IPaginatedDto<out TDto> where TDto : IDto 
{ 
    int PageIndex { get; set; } 
    int PageSize { get; set; } 
    int TotalCount { get; set; } 
    int TotalPageCount { get; set; } 
    bool HasNextPage { get; set; } 
    bool HasPreviousPage { get; set; } 
    IEnumerable<TDto> Dtos { get; } 
} 

और अपने PaginatedDto<TDto> इस इंटरफेस को लागू करेगा:

public class PaginatedDto<TDto> : IPaginatedDto<TDto> where TDto : IDto 
{ 

    public int PageIndex { get; set; } 
    public int PageSize { get; set; } 
    public int TotalCount { get; set; } 
    public int TotalPageCount { get; set; } 

    public bool HasNextPage { get; set; } 
    public bool HasPreviousPage { get; set; } 

    public IEnumerable<TDto> Dtos { get; set; } 
} 

और अपने विधि में इंटरफ़ेस का उपयोग:

private static void ProcessDto(IPaginatedDto<IDto> paginatedDto) 
{ 

    //Do work... 
} 
+0

आह, मेरे बेवकूफ सिर! मैंने वास्तव में कोशिश की लेकिन विधि को 'ProcessDto (PaginatedDto पेजिनेटेड डीटीओ' के रूप में छोड़ दिया और उम्मीद के अनुसार, यह काम नहीं किया। – tugberk

संबंधित मुद्दे