基于另一个属性值的 C# 不同属性

本文关键字:属性 另一个 | 更新日期: 2023-09-27 18:36:28

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

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

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

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

属性 A 到 Z 是单独的属性,它们的数量和类型可能因"消息类型"方法而异。

提前谢谢。

基于另一个属性值的 C# 不同属性

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

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

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

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