2015-06-01 4 views
3

У меня есть Serveral классов с одинаковыми сигнатурами методов, которые я хотел захватить в интерфейсе:интерфейса общего типа возвращаемого значение

namespace MyLib 

public class ClientList 
    public ICollection<Client> Fetch() { 
    { 
     //do stuff 
     return this.CreateCollection(); 
    } 

    private ICollection<Client> CreateCollection() 
    { 
     List<Client> clientList = new List<Client>(); 
     // populate list 
     return clientList; 
    } 

public class ProductList 
    public ICollection<Product> Fetch() { 
     //do stuff 
     return this.CreateCollection(); 
    } 

    private ICollection<Product> CreateCollection() 
    { 
     List<Product> productList = new List<Product>(); 
     // populate list 
     return productList ; 
    } 

Я хотел бы интерфейс с сигнатурой методы для Fetch, которая возвращает ICollection, типа неопределенного (так как это будет отличаться для каждого списка). Это гарантирует, что каждый объект * списка будет иметь метод выборки, а новые не будут иметь «getList» или другие такие именованные вызовы. Проведя немного исследований, я считаю, что дженериками может быть путь, но я не уверен, как это сделать.

Я попытался

public interface IDataRequest 
    ICollection<T> Fetch<T>(); 

, но когда я осуществил это как

public ICollection<Client> Fetch<Client>() 

я получил ошибку 'вернуть this.CreateCollection();':

Cannot implicitly convert type 'System.Collections.Generic.ICollection<MyLib.Client>' to 'System.Collections.Generic.ICollection<Client>'. An explicit conversion exists (are you missing a cast?)

я думал возможно, это потому, что я не указывал пространство имен. но если я изменил

public ICollection<MyLib.Client> Fetch<MyLib.Client>() 

я получил ошибку:

Type parameter declaration must be an identifier not a type

на Fetch <MyLib.Client>()

и, наконец, если я изменил его:

public ICollection<MyLib.Client> Fetch<Client>() 

затем я получил ошибку:

'MyLib.ClientList' does not implement interface member 'MyLib.IDataRequest.Fetch()'. 'MyLib.ClientList.Fetch()' cannot implement 'MyLib.IDataRequest.Fetch()' because it does not have the matching return type of 'System.Collections.Generic.ICollection'.

У меня нет большого знания дженериков и вы достигли предела того, что я могу попробовать с попытками культа груза. Это то, что я хочу сделать возможным? Если это так, вы можете показать мне как подпись метода интерфейса, так и пример определения метода класса.

В соответствии с просьбой в комментарии здесь класс клиента:

namespace MyLib 
{ 
    using System.Data; 
    using System.Runtime.Serialization; 

    [DataContract] 
    public class Client 
    { 
     public Client(DataRow clientRecord) 
     { 
      this.clientId = clientRecord.Field<string>("ID"); 
      this.cphh = clientRecord.Field<string>("ID"); 
      this.name = clientRecord.Field<string>("Name"); 
      this.address = clientRecord.Field<string>("Address"); 

      if (CommonUtilities.GIS.ValidateOSMapRef(clientRecord.Field<string>("Locationd"))) 
      { 
       this.location = string.Format(
        "{0}, {1}", 
        CommonUtilities.GIS.ConvertMapRefToEasting(clientRecord.Field<string>("Locationd")), 
        CommonUtilities.GIS.ConvertMapRefToNorthing(clientRecord.Field<string>("Locationd"))); 
      } 
     } 

     [DataMember] 
     public string clientId { get; private set; } 

     [DataMember] 
     public string name { get; private set; } 

     [DataMember] 
     public string address { get; private set; } 

     [DataMember] 
     public string location { get; private set; } 

     [DataMember] 
     public string cphh { get; private set; } 
    } 
} 
+0

убедитесь, что ваши 'использование' правильные. –

+0

Оператор return внутри метода возвращает коллекцию другого типа, отличную от той, которую вы объявили возвращаемым методом. Как объявляется 'MyLib.Client'? Можете ли вы опубликовать некоторый скелетный код его декларации? (Включая скелетные окружающие классы и/или пространства имен) –

+0

@ DanielA.White все эти классы находятся в одном и том же пространстве имен, есть ли что-нибудь еще, на что я должен обратить внимание. – mattumotu

ответ

3

Вы определили ваш интерфейс неправильно. Попробуйте так:

public interface IDataRequest<T> 
{ 
    ICollection<T> Fetch(); 
} 

Тогда ваши классы выглядеть следующим образом:

public class ClientList : IDataRequest<Client> 
{ 
    public ICollection<Client> Fetch() 
    { 
     //do stuff 
     return this.CreateCollection(); 
    } 

    private ICollection<Client> CreateCollection() 
    { 
     List<Client> clientList = new List<Client>(); 
     // populate list 
     return clientList; 
    } 
} 

public class ProductList : IDataRequest<Product> 
{ 
    public ICollection<Product> Fetch() 
    { 
     //do stuff 
     return this.CreateCollection(); 
    } 

    private ICollection<Product> CreateCollection() 
    { 
     List<Product> productList = new List<Product>(); 
     // populate list 
     return productList ; 
    } 
} 

Это компилирует красиво.

+0

Спасибо, что действительно компилируется красиво, также отлично работает! – mattumotu

Смежные вопросы