我有几个类似方法签名的类,我希望在界面中捕获:
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,类型为undefined(因为它对每个列表都不同)。这将确保每个* list对象都有一个fetch方法,而新的对象将没有'getList'或其他这样的命名调用。在做了一些研究后,我相信仿制药可能是要走的路,但我不确定如何。
我试过
public interface IDataRequest
ICollection<T> Fetch<T>();
但当我将其实现为
时public ICollection<Client> Fetch<Client>()
我在'return this.CreateCollection();':
上收到错误无法隐式转换类型 '了System.Collections.Generic.ICollection&LT; MyLib.Client&GT;'至 '了System.Collections.Generic.ICollection&LT;客户&GT;'。一个明确的 存在转换(你错过了演员吗?)
我想也许是因为我没有指定命名空间。但如果我改为
public ICollection<MyLib.Client> Fetch<MyLib.Client>()
然后我收到了错误:
类型参数声明必须是标识符而不是类型
on Fetch&lt; MyLib.Client&gt;()
最后如果我改为:
public ICollection<MyLib.Client> Fetch<Client>()
然后我收到了错误:
'MyLib.ClientList'没有实现接口成员'MyLib.IDataRequest.Fetch()'。 'MyLib.ClientList.Fetch()'无法实现'MyLib.IDataRequest.Fetch()',因为它没有匹配的返回类型'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 :(得分: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 ;
}
}
编译得很好。