3

我正在写一个消息处理器。处理器通过数据流接收消息。消息可能有不同的类型,但所有类型都有一些共同的属性,例如长度、校验和等。此外,每种类型的消息也有自己的属性。

对于它的实现,我正在考虑创建一个包含公共属性的类(比如消息类),并从消息类继承来为每种消息类型创建单独的类。首先,我想知道在这种情况下继承是否是一个好的解决方案?或者还有其他更好的方法吗?

另外,我想将原始消息传递给一个方法,该方法将相应的属性返回给消息(包括公共和个人)。由于单个属性会根据消息类型发生变化,我如何实现只返回一个对象的方法?为了更好地解释,我不希望它为每种消息类型返回不同的对象。我宁愿有一个通用对象,它具有基于另一个属性(如“MessageType”)的一些特定属性,如下所示:

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

属性 A 到 Z 是单独的属性,它们的数量和类型可能会根据“MessageType”方法而有所不同。

提前致谢。

4

2 回答 2

3

你问题的前半部分听起来像继承是一个完美的选择。但是,在阅读了您需要获取常见和单独属性列表的信息后,这似乎不太合适。

最终,表示此信息的最佳方式取决于您打算如何处理它。

如果您想要一个返回两种信息类别的公共对象,键/值解决方案似乎是合理的,至少对于单个属性而言。类似于以下内容:

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

当您说“我不希望它为每种消息类型返回不同的对象”时,您是指运行时类型还是设计时类型?如果您的意思是设计时类型,那么这不是问题,只需让该方法返回所有消息的基础对象。

如果您确实想在运行时只返回一种类型,那么 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 回答