在partial类上创建Polymorphic方法以在c#上发送泛型类型

时间:2014-04-29 13:53:36

标签: c# wcf polymorphism

我想为各种部分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>();

1 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情:

public IEnumerable<Enumerador> GetClients<T>() where T : IEnumerador, new()
{
    T _cli = new T();
    return _cli.Enumerar();            
}

它强制TIEnumerador并且具有无参数构造函数。

这样称呼:

IEnumerable<Enumerador> c = GetClients<Clientes>();

IEnumerable<Enumerador> v = GetClients<Vendors>();