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

时间:2012-06-06 20:44:54

标签: c# class properties

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

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

另外,我想将一条原始消息传递给一个方法,该方法返回相应的消息属性(包括common和individual)。由于各个属性根据消息类型而变化,我如何实现该方法只返回一个对象?为了更好地解释,我不希望它为每种消息类型返回不同的对象。我宁愿有一个基于另一个属性的一般对象,如“MessageType”,如下所示:

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

属性A到Z是单个属性,它们的数量和类型可能因“MessageType”方法而异。

提前致谢。

2 个答案:

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

相关问题