Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从WCF服务返回带有泛型字典的泛型对象_C#_Wcf - Fatal编程技术网

C# 从WCF服务返回带有泛型字典的泛型对象

C# 从WCF服务返回带有泛型字典的泛型对象,c#,wcf,C#,Wcf,我使用以下方法提供WCF服务: [OperationContract] TernaryWebServiceResponse<long> ModifyObservations(...); 响应对象如下所示: [DataContract] public class TernaryWebServiceResponse<T> { [DataMember] public TernaryProcessingResultStatus ProcessingSuccess

我使用以下方法提供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.DataContractSerializerMessageCompactImporter 错误:引用类型“TernaryWebServiceResponse”1,常规, 版本=1.0.0.0,区域性=中性,PublicKeyToken=空,带数据 命名空间中的协定名称“TernaryWebServiceResponseOflong” 'http://schemas.datacontract.org/2004/Genaral.SoapCommunication' 无法使用,因为它与导入的DataContract不匹配。需要 从引用的类型中排除此类型


谁能给我解释一下,到底是什么问题?我知道,只要解决了泛型,就可以在WCF合同中使用泛型,例如,不是MyObj而是MyObj。这门课怎么了?是否在类中定义的T无法在字典中以某种方式解析?

也许定义一个新契约会有所帮助。 比如:

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

如果类的泛型类型仅用于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);
    }

}

我把它标记为一个答案,因为我实际上在最后使用了它,尽管它不能解释为什么会发生这种情况。问题实际上是字典序列化。在某些情况下,编写一个可序列化的字典包装器是可行的,以防smb else在这个问题上遇到麻烦。
[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);
    }

}