在命名空间范围覆盖Equals方法

时间:2017-12-30 06:44:41

标签: c# string comparison override extension-methods

用例: 在最近的代码修复中,我观察到开发人员没有在字符串比较之前统一转换字符串的情况,这导致了生产环境中的错误。

这引发了我需要在命名空间作用域覆盖默认 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());
    }
}

有人可以帮助我知道实现我想要的是否可行 - > 一个变化 - 许多修复。

1 个答案:

答案 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这样的工具可以提供帮助,或者只是做一个简单的查找和替换。我想在生产之前检查任何代码更改。