在分部类上创建Polymorphic方法以在c#上发送泛型类型
本文关键字:泛型类型 Polymorphic 创建 方法 | 更新日期: 2023-09-27 18:00:39
我想为各种部分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客户端调用它,我会得到:
非泛型方法"哦。客户OhmioService。OhmioServiceClient。GetEnumerador()'不能与类型参数一起使用
有什么想法吗?
更新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>();
你可以试试这样的东西:
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>();