作为一个纯粹主义者,我讨厌在我的代码中传播字符串常量:
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
的所有字符串?
答案 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的隐式转换,但不是来自字符串。不幸的是,您需要更改整个代码库以使用包装器。