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

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,

我正在尝试从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;
 }
这已经足够好了,但是当我要检查的对象为空时,它就不起作用了:

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的建议。这是一个很好且有用的答案。