11

私は、オブジェクトに多くの「属性」を提供するサードパーティのアプリケーションを持っています。これは、単に(文字列)キーと値のペアです。値のタイプは、文字列、DateTime、Int32、またはInt64のいずれかです。

このオブジェクトを便利な方法で表すために、独自のクラスを作成する必要があります。このオブジェクトをクライアントに提供するWCFサービスを作成しているので、非常に簡単でクリーンである必要があります。

属性のキーは、クライアントの列挙型として表示されます(サードパーティアプリケーションの特定のキー文字列の情報を非表示にするため)。ただし、値を表す方法がわかりません。オプションのいくつかを次に示します。

オプション1:属性値ごとに異なるコレクションを使用します。見苦しいようですが、クライアントにとっては非常に使いやすいでしょう。

public class MyObject
{
    public Dictionary<MyTextAttributeKeysEnum, string> TextAttributes { get; set; }
    public Dictionary<MyDateAttributeKeysEnum, DateTime> DateAttributes { get; set; }
    public Dictionary<MyNumAttributeKeysEnum, long> NumericAttributes { get; set; }

    public string Name { get; set; }
    public string Id{ get; set; }

オプション2:すべての属性を文字列に変換する

public class MyObject
{
    public Dictionary<MyAttributeKeysEnum, string> MyAttributes { get; set; }

    public string Name { get; set; }
    public string Id{ get; set; }

オプション3:それらをオブジェクトとして保持し、クライアントがキャストと変換に煩わされるようにします

public class MyObject
{
    public Dictionary<MyAttributeKeysEnum, object> MyAttributes { get; set; }

    public string Name { get; set; }
    public string Id{ get; set; }
4

2 に答える 2

5

いくつかの辞書を使用するのは見栄えがよくありません:)しかし、いくつかのシナリオではうまくいくかもしれません。

文字列で十分だと確信している場合は、文字列を使用してください。しかし、他のコードがそれを解析する必要がある場合は、費用がかかります。

本当にシンプルで直接的な解決策が必要な場合は、オブジェクトを使用してください。値型のボックス化/ボックス化解除が導入され (何千ものオブジェクトを操作しない場合は忘れてください)、値の型情報が失われますが、このソリューションは問題なく機能する可能性があります。

また、値に中間クラスを導入することを検討することもできます。何かのようなもの

public Dictionary<MyAttributeKeysEnum, PropertyBagValue> MyAttributes { get; set; }

public class PropertyBagValue
{
    public object AsObject { get; set; }
    public string AsString { get; set; }
    public int AsInt { get; set; }
    // ...
}

内部的には、値を元の型の変数 (int 変数に int 、string 変数に string など、つまり、型ごとに個別の変数を持つ) に格納すると、型変換を回避できます。また、辞書を別のクラスでラップし、いくつかの便利なアクセサーを追加して、見栄えを良くすることもできます。ただし、これがインフラストラクチャにどのように適合するかはわかりません。

于 2011-12-20T23:23:03.700 に答える
0

DataContract クラスを抽象化し、派生クラスで必要な型を辞書に提供するのはどうですか。

[DataContract]
[KnownType(typeof(My3dPartyObjectString))]
[KnownType(typeof(My3dPartyObjectInt64))]
public abstract class My3dPartyObjectBase
{
// some common properties
}

[DataContract]
public class My3dPartyObjectString : My3dPartyObjectBase
{
public Dictionary<3PAttributeKeysEnum, string> MyStringAttributes { get; set; }
}

[DataContract]
public class My3dPartyObjectInt64 : My3dPartyObjectBase
{
public Dictionary<3PAttributeKeysEnum, long> MyStringAttributes { get; set; }
}

次に、クライアントは返されたオブジェクトの実際のタイプを分析し、タイプに基づいて属性のコレクションを取得する必要があります。それはあなたの3dオプションに近いでしょうが、クライアントは少なくとも応答オブジェクトレベルである程度の型安全性を持っています.

于 2011-12-20T13:21:42.017 に答える