UseCase:在最近的代码修复中,我观察到开发人员没有在字符串比较之前统一转换字符串的情况,这导致了生产环境中的错误。
这触发了我需要在命名空间范围覆盖默认的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());
}
}
有人可以帮助我知道是否有可能实现我想要的 - >一个变化 - 许多修复。
如果你不是在寻找文化意识的比较,请使用它
string.Equals(val1, val2, StringComparison.OrdinalIgnoreCase)
还要在配置系统周围创建一个包装器,让所有类使用此包装器来访问app / web.configs。像这样
public class Configuration: IConfiguration
{
public Configuration
{
this.Foo = ConfigurationManager.AppSettings["MyConfig"];
}
public string Foo { get; private set; }
public bool IsMatch(string str) { return string.Equals(str, this.Foo, StringComparison.OrdinalIgnoreCase); } }
}
然后,您可以将IConfiguration实例注入您在项目中使用的任何类构造函数。
我强烈建议不要对Equal进行任何重载。你想要的工具已经在BCL中,所以为什么要重新发明轮子。这可能是400多个替换品的痛苦,但像Resharper这样的工具可以提供帮助,或者只是做一个简单的查找和替换。我想在生产之前检查任何代码更改。