接口泛型返回类型

时间:2015-06-01 10:14:36

标签: c# generics interface

我有几个类似方法签名的类,我希望在界面中捕获:

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; }
    }
}

1 个答案:

答案 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 ;
    }
}

编译得很好。