我可以阻止自动从字符串转换为XName吗?

时间:2016-02-18 21:59:58

标签: c# linq-to-xml

作为一个纯粹主义者,我讨厌在我的代码中传播字符串常量:

var x = element.Attribute("Key");

我喜欢将它们存储为单个引用的常量,我喜欢我在Eric White的 XmlPowerTools 中首次看到的方法:

public class MyNamespace {
  public static readonly XNamespace Namespace = "http://tempuri.org/schema";
  public static readonly XName Key = Namespace + "Key";
}

并使用:

var x = element.Attribute(MyNamespace.Key);

这样做的好处是我可以使用Visual Studio或Resharper轻松找到对这些static字段的所有引用,而不必浏览每个找到的字符串“Key”的实例,可以想象使用它在很多不相关的地方。

因此,我有一个遗留项目,我希望使用XName方法转换为该项目,并且需要查找所有使用字符串而不是XName的情况。我想如果我可以停止将字符串自动转换为XName,编译器会为我拾取所有这些事件。

我在查找中使用了正则表达式:

(Element|Attribute|Ancestor)s?\("

拿起那些结构,但后来我找到了:

if (element.Name == "key")

并想知道我还会错过什么。

问题是,如何停止将字符串自动转换为XName,或者使用其他方法来查找应该为XName的所有字符串?

2 个答案:

答案 0 :(得分:1)

隐式运算符无法停止

另一方面,取自MSDN

  

XName不包含任何公共构造函数。相反,这个班级   提供String的隐式转换,允许您创建   一个XName

或者,你可以改变这段代码:

if (element.Name == "key")

...成:

   XName key = "key";

   if(element.Name == key)
顺便说一句,我觉得你为了获得更多可搜索性而过于复杂化,而编码语言编码的目标是生成可执行代码,你应该编写尽可能简单的代码以提高可维护性和质量...

答案 1 :(得分:0)

因此,有一种方法可以修复它,但不能阻止它(不包装XName库)。

删除对XName库的引用,使用相同的命名空间创建自己的XName类,但不提供字符串隐式转换。 尝试编译,您将找到为XName分配字符串的所有位置。

你可能不得不玩它来正确编译(例如,将你的新类放入一个单独的库中, it 只有它引用{{ 1}}库,并且是原始的子类,所以在API中使用对象时它不会失败。

一旦你修好了所有内容,然后删除该类并重新添加XName库。

为了防止它在将来,您可以编写一个类,它提供对XName的隐式转换,但不是来自字符串。不幸的是,您需要更改整个代码库以使用包装器。