作为一个纯粹主义者,我讨厌在我的代码中传播字符串常量:
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?
因此,有一种方法可以潜在地修复它,但不能阻止它(无需包装 XName 库)。
删除对库的引用XName,使用相同的命名空间创建您自己的 XName 类,但不提供字符串隐式转换。尝试编译一下,你会发现所有给字符串赋值的地方XName.
您可能需要使用它才能正确编译(例如,将您的新类放入一个单独的库中,让它并且仅它引用该XName库,并对原始类进行子类化,以便在使用该对象时不会编译失败在 API 中)。
修复完所有问题后,删除该类并重新添加 XName 库。
为了防止将来发生这种情况,您可以编写一个提供到 XName 的隐式转换的类,但不提供从字符串的隐式转换。但不幸的是,您需要更改整个代码库才能使用包装器。