我想为各种部分C#类实现一个通用的List过程。我将使用这种通用方法来填充组合框以过滤数据。
到目前为止,我试过这个:
接口
首先,我创建了一个通用接口和一个自定义类
public class Enumerador
{
public int ID{ get; set; }
public string Description{ get; set; }
}
interface IEnumerador
{
IEnumerable<Enumerador> Enumerar();
}
然后在每个类我想要这个行为,我实现这样的接口:
public IEnumerable<Enumerador> Enumerar()
{
using (var context = new OhmioEntities())
{
Clientes _allClients = new Clientes();
_allClients.RazonFantasia = "Any Client";
_allClients.ID_Cliente = -1;
var query = context.Clientes;
var _clients = query.Where(f => f.Activo == true).OrderBy(o => RazonFantasia).ToList();
_clients.Insert(0, _allClients);
var p = from cli in _clients
select new Enumerador { ID = cli.ID_Cliente, Description = cli.RazonFantasia };
return p.ToList();
}
}
现在我填写并返回一个通用列表。现在我的问题是我需要通过WCF将它发送给客户端,我想要一个通用(多态?)方法来做到这一点。 到目前为止,我这样解决它:
方法A
public IEnumerable<Enumerador> GetClients()
{
Clientes _cli = new Clientes();
return _cli.Enumerar();
}
方法B
public IEnumerable<Enumerador> GetVendors()
{
Vendors _vnd = new Vendors();
return _vnd.Enumerar();
}
所以我的问题是
*是否有一种多态通用方法在单个过程上编写方法A和方法B(因为它们以相同的泛型类型响应)?
*这是否与WCF服务兼容?谢谢你的一切!
更新
确定。我完成了一半。现在它可以工作了。我已经修改了我的方法:
public IEnumerable<Enumerador> GetEnumerador<T>() where T : IEnumerador, new()
{
T _obj = new T();
return _obj.Enumerar();
}
如果我在课堂上称它为伟大的工作。但如果从WCF Cliente打电话给我:
非通用方法 &#39; Ohmio.Client.OhmioService.OhmioServiceClient.GetEnumerador()&#39;不能 与类型参数一起使用
任何想法?
更新2
这是我的服务合同:
public interface IOhmioService
{
[OperationContract]
IEnumerable<Enumerador> GetEnumerador<T>() where T : IEnumerador, new();
}
这是我的班级实施:
public class OhmioService : IOhmioService
{
public IEnumerable<Enumerador> GetEnumerador<T>() where T : IEnumerador, new()
{
T _obj = new T();
return _obj.Enumerar();
}
}
然后从客户端调用它:
public IEnumerable<Enumerador> Clients { get; set; }
Clients = this.serviceClient.GetEnumerador<Clientes>();
答案 0 :(得分:1)
您可以尝试这样的事情:
public IEnumerable<Enumerador> GetClients<T>() where T : IEnumerador, new()
{
T _cli = new T();
return _cli.Enumerar();
}
它强制T
为IEnumerador
并且具有无参数构造函数。
这样称呼:
IEnumerable<Enumerador> c = GetClients<Clientes>();
和
IEnumerable<Enumerador> v = GetClients<Vendors>();