3

私はメッセージプロセッサを書いています。プロセッサは、データ ストリームを介してメッセージを受信します。メッセージにはさまざまなタイプがありますが、すべてのタイプには、長さ、チェックサムなどの共通のプロパティがあります。さらに、各タイプのメッセージには独自のプロパティもあります。

実装にあたっては、共通のプロパティを持つクラス(例えばメッセージクラス)を作り、メッセージクラスを継承してメッセージの種類ごとに個別のクラスを作ることを考えています。まず、この場合、継承が良い解決策であるかどうか疑問に思っていますか? または、他に良い方法はありますか?

また、生のメッセージをメソッドに渡したいのですが、そのメソッドは対応するプロパティをメッセージに返します(共通および個別を含む)。個々のプロパティはメッセージ タイプに基づいて変化するため、オブジェクトを 1 つだけ返すメソッドを実装するにはどうすればよいでしょうか? わかりやすく説明すると、メッセージの種類ごとに異なるオブジェクトを返すことは望ましくありません。以下のような「MessageType」のような別のプロパティに基づいた特定のプロパティを持つ一般的なオブジェクトが必要です。

Message Class:
--- Length
--- Check-sum
--- MessageType
--- Property A
--- Property B
     .
     .
     .
--- Property Z

プロパティ A ~ Z は個別のプロパティであり、その数とタイプは「MessageType」メソッドに基づいて異なる場合があります。

前もって感謝します。

4

2 に答える 2

3

あなたの質問の前半は、継承がぴったりのように聞こえます。ただし、一般的なプロパティと個々のプロパティのリストを取得する必要性について読んだところ、あまり適切ではないようです。

最終的に、この情報を表す最良の方法は、それを使って何をしようとしているのかによって異なります。

両方のカテゴリの情報を返す共通のオブジェクトが必要な場合、少なくとも個々のプロパティについては、Key/Valueソリューションが妥当と思われます。次のようなもの:

class Message
{
    CommonProperties Common { get; set; }
    // Property Name / Property Value.  Alternatively use a Tuple to also hold the type if needed.
    Dictionary<string, object> IndividualProperties { get; set; }
}

情報をさらに活用したい方法について詳細を提供していただければ、より正確なガイダンスを提供できるように努めることができます。

于 2012-06-06T20:50:27.167 に答える
1

「メッセージの種類ごとに異なるオブジェクトを返してほしくない」と言うとき、それは実行時のことですか、それとも設計時の種類のことですか? 設計時のタイプを意味する場合、それは問題ではありません。メソッドがすべてのメッセージのベース オブジェクトを返すようにするだけです。

実行時に 1 つの型だけを返したい場合は、Eric J. の回答に適切な解決策があります。

ある種の辞書を使用するという考えが気に入らず、.NET 4.0 を使用している場合。動的ルートに進むことができます。引き続き辞書を使用しますが、メッセージ オブジェクトにアクセスするコードは辞書のようには見えません。

public class Message : System.Dynamic.DynamicObject
{
    public Message(object data) { //parse data into defined properties and dictionary}

    public string MessageType {get;set;}
    //other "common" properties

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
       //binder.Name will hold the property name that is being accessed
       //if the value exists in the message, set it to the result parameter
       //and return true, else set it to null and return false (which will cause an Exception)
    }

}

呼び出しコード:

dynamic message = new Message(data);
var type = message.MessageType;
var customProperty = message.Length;

への呼び出しmessage.MessageTypeは、定義されているプロパティにアクセスするだけです。その名前のプロパティが定義されていないため、へのMessage.Length呼び出しは TryGetMember メソッドを呼び出します。

于 2012-06-06T21:09:40.130 に答える