C# 是否可以从基本对象列表访问子对象属性?

C# 是否可以从基本对象列表访问子对象属性?,c#,inheritance,properties,C#,Inheritance,Properties,我有一个基本消息对象,然后是从消息对象继承的更多特定消息对象。我希望能够将一些消息存储到列表中。我需要能够找到外部列表的索引,其中存在具有特定属性值的特定子消息。(对于我的特定项目,我将消息添加到列表的顺序始终相同,因此我将知道哪个消息位于哪个索引。) 下面是两个示例子消息: class ABCMessage : Message { public ABCMessage() { } public string ABCproperty1 { get; set; } publ

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

下面是两个示例子消息:

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;
    }
}
公共静态列表MessageList;
ABCMessage ABCMessage=新的ABCMessage();
abcMessage.ABCProperty1=1;
abcMessage.ABCProperty2=2;
abcMessage.ABCProperty3=3;
List myList=新列表();
myList.Add(abcMessage);
//...
整数指数;
for(int i=0;i

然而,问题是我无法调用该属性(或任何与此相关的属性)。有人知道如何解决这个问题吗?也许我需要在消息类中放置属性?(我想进行继承的唯一原因是使列表更容易创建。)

解决方案是将每条消息强制转换为
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;
    }
}
然而,从C#6开始,存在一个新的选项(也称为“Elvis操作符”),它充分利用了这两个方面的优点:

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

message?.ABCProperty2==5
语法仅测试
ABCProperty2
如果
message
不为空,则无需使用
!=空
test.

for(…){if(MessageList[i][0]是ABCMessage&((ABCMessage)MessageList[i][0])。ABCProperty2==5{index=i;break;}}}
?我尝试了您给出的第二个和第三个选项,但都不起作用。然而,您给出的第一个选项非常有效。
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;
    }
}
for (int i = 0; i < MessageList.Count; i++)
{
    var message = MessageList[i][0] as ABCMessage;
    if (message?.ABCProperty2 == 5)
    {
        index = i;
        break;
    }
}