从WCF服务返回带有通用字典的通用对象

时间:2012-11-15 16:36:37

标签: c# wcf

我有一个WCF服务,使用以下方法:

[OperationContract]
TernaryWebServiceResponse<long> ModifyObservations(...);

响应对象如下:

[DataContract]
public class TernaryWebServiceResponse<T>
{
    [DataMember]
    public TernaryProcessingResultStatus ProcessingSuccessStatus { get; set; }

    [DataMember]
    public Dictionary<T, bool> ProcessingSuccessDetails { get; set; } 
}

此类在共享程序集中定义,并且WCF引用配置为重用它。

但是当我生成代理时,我会得到这样的结果:

  

自定义工具警告:无法导入wsdl:portType详细信息:异常   在运行WSDL导入扩展时抛出:   System.ServiceModel.Description.DataContractSerializerMessageContractImporter   错误:引用的类型&#39; TernaryWebServiceResponse`1,General,   Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null&#39;有数据   合同名称&#39; TernaryWebServiceResponseOflong&#39;在命名空间   &#39; HTTP://schemas.datacontract.org/2004/Genaral.SoapCommunication'   无法使用,因为它与导入的DataContract不匹配。需要   从引用的类型中排除此类型。

有人可以解释一下,这究竟是什么问题?我知道只要解决了泛型,就可以在WCF合同中使用泛型,例如不是MyObj<T>而是MyObj<long>。那么这堂课有什么不对?是否在类上定义的T不能以某种方式在字典上解析?

2 个答案:

答案 0 :(得分:0)

也许定义新合同会有所帮助。 类似的东西:

[DataContract] 
public class LongTernaryWebServiceResponse : TernaryWebServiceResponse<long> 
{ 
}

然后在您的服务合同中,例如:

[OperationContract]
LongTernaryWebServiceResponse ModifyObservations(...);

答案 1 :(得分:0)

如果只有Dictionary键需要该类的泛型类型,那么您可能可以按照这一点(未经测试)执行某些操作......

[DataContract]
public class TernaryWebServiceResponse
{

    [DataMember]
    public TernaryProcessingResultStatus ProcessingSuccessStatus { get; set; }

    [DataMember]
    private Dictionary<object, bool> mProcessingSuccessDetails;

    static public TernaryWebServiceResponse Create<T>(Dictionary<T, bool> list)
    {
        var dc = new TernaryWebServiceResponse();
        dc.mProcessingSuccessDetails = new Dictionary<object, bool>();
        foreach (var pair in list)
        {
            dc.mProcessingSuccessDetails.Add((object)pair.Key, pair.Value);
        }
        return dc;
    }

    public Dictionary<T, bool> ProcessingSuccessDetails<T>()
    {
        return mProcessingSuccessDetails.ToDictionary(x => ((T)x.Key), x => x.Value);
    }

}