51

C# 列挙型を共有したいアプリケーションがいくつかあります。通常のアプリケーションと WCF サービスの間で列挙宣言を共有する方法がよくわかりません。

これが状況です。列挙値を共有する必要がある 2 つの軽量 C# デストップ アプリと WCF Web サービスがあります。

クライアント 1 は

 Method1( MyEnum e, string sUserId );

クライアント 2 は

Method2( MyEnum e, string sUserId );

ウェブサービスは

ServiceMethod1( MyEnum e, string sUserId, string sSomeData);

私の最初は、Common.dll というライブラリを作成して列挙型をカプセル化し、列挙型が必要なすべてのプロジェクトでそのライブラリを参照するだけでした。ただし、列挙型をサービスの不可欠な部分にするには、列挙型をマークアップする必要があるため、WCF では状況が難しくなります。このような:

[ServiceContract]
[ServiceKnownType(typeof(MyEnum))]
public interface IMyService
{
    [OperationContract]
    ServiceMethod1( MyEnum e, string sUserId, string sSomeData);
}

[DataContract]
public enum MyEnum{ [EnumMember] red, [EnumMember] green, [EnumMember] blue };  

だから.... WCFサービスと他のアプリケーションの間で列挙型を共有する方法はありますか?

4

4 に答える 4

47

Commonライブラリの使用は問題ないはずです。列挙はシリアル化可能であり、DataContract属性は必要ありません。

参照: http: //msdn.microsoft.com/en-us/library/ms731923.aspx

列挙型。フラグの列挙を含む列挙は、シリアル化可能です。オプションで、列挙型をDataContractAttribute属性でマークできます。この場合、シリアル化に参加するすべてのメンバーをEnumMemberAttribute属性でマークする必要があります。

編集:それでも、列挙型をDataContractとしてマークし、クライアントライブラリがそれを使用することに問題はないはずです。

于 2008-10-09T15:34:57.517 に答える
36

古いサービス参照か何かで問題が発生したに違いありません。戻って列挙型を含む共通ライブラリを作成したところ、すべて正常に動作しました。サービス インターフェイスのファイルに using 参照を追加しただけです。

using Common;  

[ServiceContract]
[ServiceKnownType(typeof(MyEnum))]
public interface IMyService
{
    [OperationContract]
    ServiceMethod1( MyEnum e, string sUserId, string sSomeData);
}

そして私は以下を落としました:

[DataContract]
public enum MyEnum{ [EnumMember] red, [EnumMember] green, [EnumMember] blue };

enum は ServiceKnownType を介して参照されるため、[DataContract] または [Enumerator] を使用して外部ライブラリでマークアップする必要はなかったと思います。

于 2008-10-09T20:16:45.107 に答える
35

私はかなり奇妙な問題を抱えていて、あなたにとって興味深いかもしれないと思いました。また、データ コントラクトで列挙型を使用すると接続が停止するという問題もありました。本当の問題が何であるかを見つけるのにかなりの時間がかかりました: int 値が割り当てられた列挙型を使用しました。0 ではなく 1 で開始されました。明らかに、WCF では、シリアル化のために 0 に等しい列挙値が必要です。列挙内に値を指定しない場合は、0 から始まる int 値の自動マッピングが自動的に行われるため、すべて問題ありません。しかし、値 0 が割り当てられていない他の列挙型定義をコピーして貼り付けると、WCF を介してクライアントにそれを取得できません - 奇妙ですが本当です!

于 2010-07-30T12:21:00.063 に答える
0

Enumメンバーにint値を割り当て、転送にintを使用し、必要に応じてそれらをEnum型にキャストすることができます

于 2008-10-09T15:37:52.923 に答える