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

问题描述 投票:-1回答:1

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());
    }
}

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

c# string comparison override extension-methods
1个回答
1
投票

如果你不是在寻找文化意识的比较,请使用它

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

© www.soinside.com 2019 - 2024. All rights reserved.