c# - 是否可以从基础对象的列表中访问子对象属性?

标签 c# inheritance properties

我有一个基本的 Message 对象,然后是许多从 Message 对象继承的更具体的 Message 对象。我希望能够将一些消息存储到列表列表中。我需要能够找到外部列表的索引,其中存在具有特定属性值的特定子消息。 (对于我的特定项目,我将消息添加到列表的顺序始终相同,因此我将知道哪个消息在哪个索引处。)

namespace Project
{
    public class Message {} //base class
}

这是两个示例子消息:

class ABCMessage : Message
{
    public ABCMessage() { }

    public string ABCproperty1 { get; set; }
    public string ABCProperty2 { get; set; }
    public string ABCProperty3 { get; set; }
}


class XYZMessage : Message
{
    public XYZMessage() { }

    public string XYZproperty1 { get; set; }
    public string XYZProperty2 { get; set; }
}

这是我想做的:

public static List<List<Message>> MessageList;

ABCMessage abcMessage = new ABCMessage();
abcMessage.ABCProperty1 = 1;
abcMessage.ABCProperty2 = 2;
abcMessage.ABCProperty3 = 3;
List<Message> myList = new List<Message>();
myList.Add(abcMessage);

//...

int index;
for (int i = 0; i < MessageList.Count; i++) {
    if (MessageList[i][0].ABCProperty2 == 5) {
        index = i;
        break;
    }
}

但是,问题是我无法调用该属性(或与此相关的任何属性)。有谁知道如何解决这个问题?也许我需要将属性放入我的 Message 类中? (我想做继承的唯一原因是为了更容易制作列表的列表。)

最佳答案

解决方案是将每条消息转换为 ABCMessage,然后,如果不为 null,则它是 ABCMessage 的一个实例,因此可以对其属性进行测试:

int index;
for (int i = 0; i < MessageList.Count; i++) 
{
    var message = MessageList[i][0] as ABCMessage;
    if (message != null && message.ABCProperty2 == 5) 
    {
        index = i;
        break;
    }
}

因为不是每个人都喜欢 as/test for null 方法,另一个选择是使用 is:

for (int i = 0; i < MessageList.Count; i++) 
{
    var message = MessageList[i][0] as ABCMessage;
    if (MessageList[i][0] is ABCMessage && (ABCMessage)(MessageList[i][0]).ABCProperty2 == 5) 
    {
        index = i;
        break;
    }
}

但是,从 C# 6 开始,存在一个新选项(null-conditional operator 或众所周知的“Elvis 运算符”),它兼顾了两全其美:

for (int i = 0; i < MessageList.Count; i++)
{
    var message = MessageList[i][0] as ABCMessage;
    if (message?.ABCProperty2 == 5)
    {
        index = i;
        break;
    }
}

message?.ABCProperty2 == 5 语法只测试 ABCProperty2 如果 message 不为 null,则不需要 != null 测试。

关于c# - 是否可以从基础对象的列表中访问子对象属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31392995/

相关文章:

c# - 带有 SSH.NET 的 Linux : “sorry, you must have a tty to run sudo”

c# - 阻止 ASP.NET 中的整数溢出

c# - 有没有办法验证 powershell 脚本?

具有匿名结构的 C11 结构继承

java - 如何从 servlet 中可移植地读取配置数据

c# - 在应用程序设置中存储带值的字符串数组

c++ - 在编译时将继承限制为所需数量的类

java - 防止打印多个对象

python - getter 和 setter 的谷歌风格指南属性

Javascript:在通过其他属性选择的 DOM 对象上运行对象方法