我有一个基本的 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/