用例: 在最近的代码修复中,我观察到开发人员没有在字符串比较之前统一转换字符串的情况,这导致了生产环境中的错误。
这引发了我需要在命名空间作用域覆盖默认 Equals()方法的现有代码,其中发生了数百个字符串比较。
在我去400多个地方手动修复之前, 我正在尝试这些方法,但找不到令人满意的结果。
Approach1:
问题:需要新的方法名称 - > NewEquals()。这需要在所有类中进行更改。我们不能在这里使用' Equals()',因为实例方法优先级更高。
class Program
{
static void Main(string[] args)
{
string strFromConfig = "sometext";
const string str = "SomeText";
Console.WriteLine(str.Equals(strFromConfig)); // False
Console.WriteLine(str.NewEquals(strFromConfig)); // True
}
}
static class StringCompare // Extension method approach
{
public static bool NewEquals(this string str, string strconfig)
{
// edited this as per the suggestion in the comments.
return str.Equals(strconfig, StringComparison.OrdinalIgnoreCase);
}
}
Approach2:
问题:也许我在覆盖Equals()时犯了一些错误。
即使它有效,它也有一个con,这个被覆盖的函数不会 在命名空间内可用。因此它不会修复所有类。
class Program
{
static void Main(string[] args)
{
string strFromConfig = "sometext";
const string str = "SomeText";
Console.WriteLine(str.Equals(strFromConfig)); // False
// This also doesn't invoke overridden method.
Console.WriteLine(str.Equals((object)strFromConfig)); // False
}
public override bool Equals(object obj)
{ // Program control doesn't enter here. So could not test the below two returns.
return base.Equals(obj);
//return base.ToString().ToLower().Equals(obj.ToString().ToLower());
}
}
有人可以帮助我知道实现我想要的是否可行 - > 一个变化 - 许多修复。
答案 0 :(得分:1)
如果您不是在寻找文化感知比较,请使用此
SELECT CONCAT_WS(' ', first_name, last_name)
FROM employees
还要在配置系统周围创建一个包装器,让所有类使用此包装器来访问app / web.configs。喜欢这个
string.Equals(val1, val2, StringComparison.OrdinalIgnoreCase)
然后,您可以将IConfiguration的实例注入您在项目中使用的任何类构造函数。
我强烈建议不要对Equal进行任何重载。你想要的工具已经在BCL中,所以为什么要重新发明轮子。这可能是400多个替换品的痛苦,但像Resharper这样的工具可以提供帮助,或者只是做一个简单的查找和替换。我想在生产之前检查任何代码更改。