我有一个由许多不同控件类型组成的应用程序,每个控件类型都可以选择与参数对象链接。
然后将它们保存在XML文件中以便稍后重新加载。要将控件链接到参数(如果已指定),控件将存储参数ID。然后在加载和重新链接期间搜索它。
但是,由于这是可选的,如果未指定参数,则在尝试访问可理解的ID时会出现NullReferenceException。我可以通过检查有问题的线来解决这个问题。但是,我必须为许多不同的控件类型执行此操作,而不仅仅是在此基本示例中显示的一个引用。
所以我的问题是,是否有一种优雅的方式允许此调用只返回一个空字符串而不是此异常?
public class Parameter
{
public string ID;
}
public class LabelCtrl
{
public string Name;
public Parameter LinkedParameter;
}
public class XMLManager
{
public void SaveControl(ControlInstance_LabelCtrl ci)
{
xmlWriter.WriteStartElement("ControlInstance_LabelCtrl");
{
xmlWriter.WriteElementString("Name", ci.Name);
// Elegant way to insert empty string instead of causing NullReferenceException error
xmlWriter.WriteElementString("LinkedParameter", ci.LinkedParameter.ID);
}
xmlWriter.WriteEndElement();
}
}
答案 0 :(得分:2)
使用空传播运算符(可从C#6获得):
xmlWriter.WriteElementString("Name", ci.Name);
xmlWriter.WriteElementString("LinkedParameter", ci.LinkedParameter?.ID);
或者对于C#6之前的使用:
ci.LinkedParameter != null ? ci.LinkedParameter.ID : null;
答案 1 :(得分:0)
对ci.LinkedParameter.ID使用一个简单的测试作为字符串:
if (!String.IsNullOrEmpty(ci.LinkedParameter.ID)) {
xmlWriter.WriteElementString("LinkedParameter", ci.LinkedParameter.ID);
}
else {
xmlWriter.WriteElementString("LinkedParameter", String.Empty);
}
或使用简单的try-catch块:
try {
xmlWriter.WriteElementString("LinkedParameter", ci.LinkedParameter.ID);
}
catch (e) {
xmlWriter.WriteElementString("LinkedParameter", String.Empty);
}
如果您不想更改模型CMIIW的行为,则适用这些语句。
答案 2 :(得分:0)
如果您不使用C#6,则可以使用三元运算符:
xmlWriter.WriteElementString("LinkedParameter", (ci.LinkedParameter != null) ? ci.LinkedParameter.ID : "");
如果你有很多像这样的线条,它是一个if / else但更紧凑,更优雅。