1


0

インターフェースを返す運用契約をしたい。

私の問題:

1)返されることになる既知の型をサービスに動的に登録するか、WCFにその型を受け入れさせます。 私は、それが属性でマークされた既知のタイプでないか、サービスの静的メソッドでない限り、メソッドが失敗することに気付きました。

2)クライアントサイドで、メッセージからインターフェースの動的実装を構築できるようにしたい。

私はメッセージを台無しにしたくありません。 実装の詳細を隠したいだけです。

2 Answer


1


私は同じ状況に遭遇しました:私はあなたが設計によって[KnownType]属性を使うように*あなたが持っていると思うので、シリアライザはどの実装を待つべきかを知っています。

重要な点は、シリアライザは、バイトの読み方に関するメタデータ(主に型の名前)をほとんど含まないバイトを受け取ることです。 そのため、それらのバイトがどの型を表すと想定されているか、そしてこの型を「知る」必要があります。 _この情報がなければ、シリアライザがあなたのインタフェース機能を実装しているいくつかのフィールドを見つけることになっている場所を見つけることは絶対に不可能です。

ただし、DataContractSerializerを直接使用して、実行時に(つまり動的に)新しいKnownTypeを追加できます。

そのトピックに関する多くの情報 ここ


0


KnownTypeAttributeの特定のオーバーロードを使用してDataContractの既知のTypesを返すメソッドを実装し、既知のTypesを配列として返すメソッドの名前を指定することができます。 このメソッドは実行時にのみ認識される型を返すことができます。

[DataContract]
[KnownType("GetKnownTypes")]
パブリッククラスMyDataContract {public int X {get;}セット; }

public static Type [] GetKnownTypes(){return Type [] {typeof(Class1)、typeof(Class2)}; }}