【问题标题】:How to implement a generic method that returns a specific type on an interface in C#如何在 C# 中实现在接口上返回特定类型的泛型方法
【发布时间】:2017-10-20 21:59:59
【问题描述】:

我正在开发几个 WCF Http Web 服务。所有这些 WCF Web 服务都具有相同的操作,但每个 WCF Web 服务对于给定的操作返回不同的类型。

例如,有两个服务ServiceAServiceB,都具有操作GetData。但是,对于ServiceAGetData 操作必须返回一个int,对于ServiceBGetData 操作必须返回一个string

ServiceA 接口:

[ServiceContract]
public interface IServiceA
{
    [OperationContract]
    int GetData();
}

ServiceA 实现:

public class ServiceA : IServiceA
{
    public int GetData()
    {
        return 0;
    }
}

ServiceB 接口:

[ServiceContract]
public interface IServiceB
{
    [OperationContract]
    string GetData();
}

ServiceA 实现:

public class ServiceB : IServiceB
{
    public string GetData()
    {
        return "any text";
    }
}

WCF Web 服务需要正确地公开元数据,我的意思是,它们必须公开GetData 操作返回的数据类型(string),以便告诉服务使用者哪种类型的数据预计。换句话说,拥有 XSD 架构。

如您所知,当您创建一个新的 WCF Web 服务时,VS 会创建一个用于声明操作的接口并声明所需的[ServiceContract][OperationContract] 属性,并创建实现该接口的类。

为了使代码标准化并节省键入接口实现的时间,我想创建一个对所有 WCF Web 服务通用的接口,它将通用操作(例如GetData)声明为通用,然后, 指定实现的类型。

我想做这样的事情:

通用接口:

[ServiceContract]
public interface IServiceCommon
{
    [OperationContract]
    T GetData<T>();
}

ServiceA 接口:

[ServiceContract]
public interface IServiceA : IServiceCommon
{

}

ServiceA 实现:

public class ServiceA : IServiceA
{
    public int GetData()
    {
        return 0;
    }
}

但是,我收到以下错误:

'ServiceA' 没有实现接口成员'IServiceCommon.GetData()'

如何实现在 GetData 方法上返回任何类型值的任何服务类?

【问题讨论】:

    标签: c# .net wcf


    【解决方案1】:

    在写这篇文章的时候,我想出了解决方案,将接口声明如下:

    通用接口:

    [ServiceContract]
    public interface IServiceCommon<T>
    {
        [OperationContract]
        T GetData();
    }
    

    ServiceA 接口:

    [ServiceContract]
    public interface IServiceA : IServiceCommon<int>
    {
    
    }
    

    ServiceA 实现:

    public class ServiceA : IServiceA
    {
        public int GetData()
        {
            return 0;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-10-16
      • 1970-01-01
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多