2

私が持っているこのような状況があります

  • WCF サービス (VS2008) どこかでホスト
  • この WCF サービスへのサービス参照を持つ「クラス ライブラリ」タイプのコンシューマー プロジェクトを持つメイン ソリューション (VS2005)
  • データ契約には、次のようなデータメンバーがあります...

    [DataContract]
    public class Cmd
    {
       [DataMember]
       public string CommandText;
       [DataMember]
       public CommandType CommandType;
    }
    

プロキシ service.cs は、消費者プロジェクトのサービス参照フォルダーに生成されます (vs 2005 を使用しているためである可能性があります)。これには、enum CommandType が新しい定義を取得したサービスのすべての宣言が含まれています。

[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "3.0.4506.30")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://schemas.datacontract.org/2004/07/System.Data")]
public enum CommandType
{
    Text,
    StoredProcedure,
    TableDirect,
}

System.Data からのこの元の列挙型の代わりに

public enum CommandType
{    
    Text = 1,    
    StoredProcedure = 4,    
    TableDirect = 512,
}

これにより、クライアントからサーバーへの CommandType 値の誤った割り当てが発生します。

  1. これを克服するために何をすべきか。
  2. WCF サービスでこの CommandType 列挙型をオーバーライドして、全体で同じ列挙型定義を取得できますか。

問題文が長くてすみません…

4

2 に答える 2

0

int から明示的に継承する独自の列挙型を定義し、カスタム列挙型がサーバーに到着したときにカスタム列挙型から System.Data 列挙型にキャストしてみてください。

public enum MyEnum : int {    
    Text = 1,    
    StoredProcedure = 4,    
    TableDirect = 512,
}

サーバ側:

CommandType t = (CommandType)myEnumVariable;
于 2011-08-17T06:59:25.133 に答える
0

WCF の列挙型は単なる文字列です。CommandType 値は SOAP ペイロードに "Text"、"StoredProcedure" などとして存在します。サーバー側でのみ int としてキャストできます。コントラクトで int 値を使用する場合は、Cmd.CommandType を int として定義し、「KnownTypes」ディレクティブを介して列挙型を公開する必要があります。ただし、そのようなものは、列挙型であるという目的を無効にします。または、クライアント側でのキャストを完全に避けてください。

于 2011-08-17T07:13:03.777 に答える