我正在写一个消息处理器。处理器通过数据流接收消息。消息可能有不同的类型,但所有类型都有一些共同的属性,例如长度,校验和等。此外,每种类型的消息也有自己的属性。
对于它的实现,我正在考虑创建一个包含公共属性的类(比如消息类),并从消息类继承为每种消息类型创建单独的类。首先,我想知道在这种情况下继承是否是一个很好的解决方案?或者还有其他更好的方法吗?
另外,我想将一条原始消息传递给一个方法,该方法返回相应的消息属性(包括common和individual)。由于各个属性根据消息类型而变化,我如何实现该方法只返回一个对象?为了更好地解释,我不希望它为每种消息类型返回不同的对象。我宁愿有一个基于另一个属性的一般对象,如“MessageType”,如下所示:
Message Class:
--- Length
--- Check-sum
--- MessageType
--- Property A
--- Property B
.
.
.
--- Property Z
属性A到Z是单个属性,它们的数量和类型可能因“MessageType”方法而异。
提前致谢。
答案 0 :(得分: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; }
}
如果您提供有关 的更多详细信息,我们可以尝试提供更准确的指导。
答案 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方法,因为没有定义该名称的属性。