У меня есть 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; }
}
}
убедитесь, что ваши 'использование' правильные. –
Оператор return внутри метода возвращает коллекцию другого типа, отличную от той, которую вы объявили возвращаемым методом. Как объявляется 'MyLib.Client'? Можете ли вы опубликовать некоторый скелетный код его декларации? (Включая скелетные окружающие классы и/или пространства имен) –
@ DanielA.White все эти классы находятся в одном и том же пространстве имен, есть ли что-нибудь еще, на что я должен обратить внимание. – mattumotu