C# 无法使用空对象调用扩展方法
我正在尝试从XmlDocument中解析XML属性。由于某个节点可能没有特定属性,因此我创建了一个扩展方法来检查属性,并在属性为null或无效时返回默认值:C# 无法使用空对象调用扩展方法,c#,extension-methods,C#,Extension Methods,我正在尝试从XmlDocument中解析XML属性。由于某个节点可能没有特定属性,因此我创建了一个扩展方法来检查属性,并在属性为null或无效时返回默认值: public static bool TryParseOrDefault(this string toParse, bool defaultValue) { if(toParse == null) return defaultValue; bool result; if(Boolean.TryParse(toParse,
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;
}
这已经足够好了,但是当我要检查的对象为空时,它就不起作用了:
var whatever = column.Attributes["SomeAttribute"].Value.TryParseOrDefault(true);
在这种情况下,列
节点没有SomeAttribute
属性,因此值
为null,并引发NullReferenceException
。为什么呢?我认为扩展方法应该适用于空对象,因为调用基本上可以转换为:
MyExtensions.TryParseOrDefault(column.Attributes["SomeAttribute"].Value,true);
我怀疑问题在于,如果
Attributes[“SomeAttribute”]
返回null,那么查找值
属性将失败。如果列
是一个XmlElement
,那么肯定是这样的-请查看:
属性值具有指定名称的XmlAttribute。如果属性不存在,则此属性返回null 关于扩展方法的翻译,你是对的,但我认为这不是问题所在。不过,测试这一点很容易——只需将语句拆分以进行诊断:
string tmp = column.Attributes["SomeAttribute"].Value;
var whatever = tmp.TryParseOrDefault(true);
我想你会发现异常在第一行,而不是第二行
您可能希望考虑使用LINQ到XML,这使得这更容易——在这里您可以使用:
string tmp = (string) column.Attribute("SomeAttribute");
如果属性丢失,则返回null
,因为如果转换的“源”是null引用,则从XAttribute
到string
的显式转换将返回null
(如果你只需要
xmldattribute
,那么符文的答案也是很好的。这取决于你想做什么。)不是.Value
是null
,而是属性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);
我用
字符串St=null尝试了您的代码;St.TryparseOrderFault(真)代码>它可以正常工作。如果您没有SomeAttribute
,那么Attributes[“SomeAttribute”]
将返回null。因此,基本上您正在尝试访问null。Value
是您获得异常的地方。谢谢,您是对的!我现在在前面对Attributes属性进行空检查,现在看一下您的LINQ到XML的建议。这是一个很好且有用的答案。