基于其他属性值的C#不同属性

3

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

为了实现这个功能,我考虑创建一个类(称为消息类),包含共同属性,并从消息类继承来创建每个消息类型的单独类。首先,我想知道在这种情况下继承是否是一个好的选择?或者有其他更好的方法吗?

此外,我想要将原始消息传递给一个方法,并且该方法返回相应的消息属性(包括共同属性和个别属性)。由于个别属性基于消息类型而变化,我该如何实现方法仅返回一个对象?为了更好地解释,我不希望它为每种消息类型返回不同的对象。我宁愿有一个通用对象,根据另一个属性“MessageType”具有某些特定属性,类似于以下内容:

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

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

提前致谢。

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; }
}

如果您提供更多关于如何进一步消耗信息的细节,我们可以尝试提供更准确的指导。

谢谢Eric的回答。基本上,每种消息类型在原始消息中都有不同的字段。一些字段用于统计目的,而一些字段是实际数据,这些数据是特定消息类型的。对于每种消息类型,我应该采取不同的行动来通知用户,或在屏幕上显示消息(当然,在每种情况下信息是不同的)。我认为你提到的字典是一个很好的解决方案。 - Afshin

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方法,因为没有定义该名称的属性。


谢谢你的回答Brian。我会按照你的解决方案来操作,因为这种方式更方便获取属性。 - Afshin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接