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