基于另一个属性值的 C# 不同属性
本文关键字:属性 另一个 | 更新日期: 2023-09-27 18:36:28
我正在编写一个消息处理器。处理器通过数据流接收消息。消息可能具有不同的类型,但所有类型都有一些通用属性,例如长度、校验和等。此外,每种类型的消息也有其自己的属性。
对于它的实现,我正在考虑创建一个包含公共属性和从消息类继承的类(例如消息类),以便为每个消息类型创建单独的类。首先,我想知道在这种情况下继承是否是一个很好的解决方案?还是有其他更好的方法?
另外,我想将原始消息传递给一个方法,该方法将相应的属性返回到消息(包括通用和单个)。由于各个属性会根据消息类型而变化,因此如何实现仅返回一个对象的方法?为了更好地解释,我不希望它为每种消息类型返回不同的对象。我宁愿有一个通用对象,它基于另一个属性(如"MessageType")具有一些特定属性,如下所示:
Message Class:
--- Length
--- Check-sum
--- MessageType
--- Property A
--- Property B
.
.
.
--- Property Z
属性 A 到 Z 是单独的属性,它们的数量和类型可能因"消息类型"方法而异。
提前谢谢。
你问题的前半部分听起来像是继承是一个完美的选择。 但是,在阅读有关您需要获取常见和单个属性列表的信息后,它似乎不太合适。
最终,表示此信息的最佳方式取决于您打算如何处理它。
如果您想要一个返回两类信息的公共对象,则键/值解决方案似乎是合理的,至少对于各个属性而言。 大致如下:
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 方法,因为未定义该名称的属性。