1

次の方法で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エラー:参照されたタイプ'TernaryWebServiceResponse`1、General、Version = 1.0.0.0、Culture = neutral、 PublicKeyToken = null'、名前空間'http://schemas.datacontract.org/2004/Genaral.SoapCommunication'のデータコントラクト名'TernaryWebServiceResponseOflong'は、インポートされたDataContractと一致しないため、使用できません。このタイプを参照タイプから除外する必要があります。

誰かplzが私を説明できますか、ここでの問題は正確には何ですか?ジェネリックは、解決されている限り、WCFコントラクトで使用できることを知ってMyObj<T>MyObj<long>ます。では、このクラスの何が問題になっていますか?クラスで定義されたTが辞書でどういうわけか解決できないということですか?

4

2 に答える 2

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);
    }

}
于 2012-11-15T17:22:08.850 に答える
0

おそらく、新しい契約を定義すると役立つでしょう。何かのようなもの:

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

そして、サービス契約では次のようになります。

[OperationContract]
LongTernaryWebServiceResponse ModifyObservations(...);
于 2012-11-15T16:43:57.520 に答える