我能否阻止自动将字符串转换为XName?

6
作为一个有点纯粹主义者,我不喜欢看到字符串常量散布在我的代码中:
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找到所有这些静态字段的引用,而不必浏览每个找到的字符串"Key"的实例,可以想象这个字符串在许多无关的地方都被使用。
所以,我有一个遗留项目,我想将其转换为使用XName方法,并需要查找所有使用字符串而不是XName的情况。我认为,如果我能停止自动将字符串转换为XName,编译器就会为我捕获所有这些情况。
我在查找中使用了正则表达式:
(Element|Attribute|Ancestor)s?\("

我曾经尝试使用这些结构,但后来发现:

if (element.Name == "key")

我曾经想过,还有什么是我会错过的。

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

2个回答

1

隐式操作符无法被“停止”。

另一方面,来自MSDN的内容:

XName不包含任何公共构造函数。相反,该类提供了一个从String进行隐式转换的方法,允许您创建XName

或者,您可以将此代码转换为:

if (element.Name == "key")

...转化为:

   XName key = "key";

   if(element.Name == key)

顺便说一下,我觉得你可能会过度复杂化事情,只是为了获得更多的可搜索性,而编程语言的目标是生成可执行代码,你应该尽可能简单地编码,以增加可维护性和质量...


你的第二段代码正是我想要做的。我只是在寻找一种快速定位它们所有的方法。 - axeman
@axeman 我认为没有办法得到你想要的,我会说你需要接受这个“限制”... :D - Matías Fidemraizer
此外,将字符串常量放入单个位置的原因是为了减少拼写/输入错误的可能性。在我看来,重复的字符串常量与重复的代码一样糟糕。我的目标是拥有正确、可维护的可执行代码。 :-) 拥有 XName 常量还可以查看大型解决方案的结构以及使用哪些命名空间的程序集。 - axeman
我想我只能手动浏览数百个实例!谢谢你证实了我的最坏的担忧! - axeman

0

所以,你有一种潜在的 修复 它的方法,但不能防止它(除非包装XName库)。

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

你可能需要做出些调整才能正确编译(例如,将你的新类放入单独的库中,只有它引用XName库,并子类化原来的类,这样在使用API对象时就不会编译失败)。

一旦你全部修复好了,那么删除这个类并重新引用 XName 库。

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


我确实编写了所需类的本地版本,并存根化方法,以便编译器能够找到它们。这是我现在的目的。将来,我会确保在创建xsd时定义XName常量,并在代码审查中注意误用情况。 - axeman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接