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

axe*_*man 6 c# linq-to-xml

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

var x = element.Attribute("Key");
Run Code Online (Sandbox Code Playgroud)

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

public class MyNamespace {
  public static readonly XNamespace Namespace = "http://tempuri.org/schema";
  public static readonly XName Key = Namespace + "Key";
}
Run Code Online (Sandbox Code Playgroud)

并使用:

var x = element.Attribute(MyNamespace.Key);
Run Code Online (Sandbox Code Playgroud)

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

所以,我有一个遗留项目,我想转换为使用该XName方法,并需要找到所有出现的字符串已被使用而不是XName.我想如果我可以停止自动转换字符串XName,编译器会为我拾取所有这些事件.

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

(Element|Attribute|Ancestor)s?\("
Run Code Online (Sandbox Code Playgroud)

拿起那些结构,但后来我发现:

if (element.Name == "key")
Run Code Online (Sandbox Code Playgroud)

并想知道我还会想念什么.

问题是,如何停止字符串的自动转换XName,或者有什么其他方法来定位应该出现的所有字符串XName

Rob*_*Rob 0

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

删除对库的引用XName,使用相同的命名空间创建您自己的 XName 类,但不提供字符串隐式转换。尝试编译一下,你会发现所有给字符串赋值的地方XName.

您可能需要使用它才能正确编译(例如,将您的新类放入一个单独的库中,让它并且引用该XName库,并对原始类进行子类化,以便在使用该对象时不会编译失败在 API 中)。

修复完所有问题后,删除该类并重新添加 XName 库。

为了防止将来发生这种情况,您可以编写一个提供到 XName 的隐式转换的类,但不提供从字符串的隐式转换。但不幸的是,您需要更改整个代码库才能使用包装器。