gpt4 book ai didi

c# - 无法使用空对象调用扩展方法

转载 作者:行者123 更新时间:2023-11-30 19:59:30 25 4
gpt4 key购买 nike

我正在尝试从 XmlDocument 中解析 XML 属性。由于某个节点可能没有特定属性,因此我创建了一个扩展方法来检查属性并在属性为 null 或无效时返回默认值:

public static bool TryParseOrDefault(this string toParse, bool defaultValue)
{
if(toParse == null) return defaultValue;
bool result;
if(Boolean.TryParse(toParse, out result))
{
return result;
}
return defaultValue;
}

这工作得很好,但是当我要检查的对象为 null 时它就不行了:

var whatever = column.Attributes["SomeAttribute"].Value.TryParseOrDefault(true);

在这种情况下,column 节点没有 SomeAttribute 属性,因此 Value 为 null 并且出现 NullReferenceException 被抛出。这是为什么?我认为扩展方法应该适用于空对象,因为调用基本上转换为:

MyExtensions.TryParseOrDefault(column.Attributes["SomeAttribute"].Value,true);

最佳答案

不是 .Valuenull,而是属性 ans 你因此有效地执行此 null.Value 抛出提到的异常。您可以更改扩展方法以接受 XAttribute 而不是字符串

public static bool TryParseOrDefault(this XAttribute toParse, bool defaultValue)
{
if(toParse == null) return defaultValue;
bool result;
if(Boolean.TryParse(toParse.Value, out result))
{
return result;
}
return defaultValue;
}

然后这样调用

var whatever = column.Attributes["SomeAttribute"].TryParseOrDefault(true);

您还可以创建对 LINQ2XML 扩展方法的覆盖

public static bool Attribute(this XElement elem, string attributeName, bool defaultValue)
{
var toParse = (string)elem.Attribute(attributeName);
bool result;
if(Boolean.TryParse(toParse, out result))
{
return result;
}
return defaultValue;
}

然后你会像这样使用它:

var whatever = column.Attribute("SomeAttribute",true);

关于c# - 无法使用空对象调用扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23752169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com