如何覆盖TryParse方法?

7

我想要覆盖boolTryParse方法,以接受“yes”和“no”。 我知道我要使用的方法(如下所示),但我不知道如何覆盖bool的方法。

... bool TryParse(string value, out bool result)
{
    if (value == "yes")
    {
        result = true;
        return true;
    }
    else if (value == "no")
    {
        result = false;
        return true;
    }
    else
    {
        return bool.TryParse(value, result);
    }
}
5个回答

11

你不能重写一个静态方法。但是你可以创建一个扩展方法。

public static bool TryParse(this string value, out bool result)
{
    // For a case-insensitive compare, I recommend using
    // "yes".Equals(value, StringComparison.OrdinalIgnoreCase); 
    if (value == "yes")
    {
        result = true;
        return true;
    }
    if (value == "no")
    {
        result = false;
        return true;
    }

    return bool.TryParse(value, out result);
}
把这段代码放在一个静态类中,然后像这样调用你的代码:
string a = "yes";
bool isTrue;
bool canParse = a.TryParse(out isTrue);

2
个人而言,我喜欢我的解析方法返回Nullable<>类型,如果字符串无法解析,则返回null。这样可以避免使用输出参数,并且使调用语法更加简洁。 例如:bool a = "blah".ParseBool() ?? false; - Greg
“Nullables” 的确很方便解析,但我想覆盖现有的 “TryParse” 方法。不过,既然我正在编写自己的方法,我可能会做类似的事情。此外,我正在使用 “StringComparison.OrdinalIgnoreCase”,但没有在我的示例中放置它,只是为了让它看起来更干净。最后,如果你的输出类型是“bool”,为什么要标记你的方法为“TryParseBoolean”?(虽然我认为如果你切换到“Nullables”,你需要那个命名。) - dlras2
@cyclotis04 - 好主意。由于有输出参数,TryParse 这个名字的确足够了。 - Greg
3
我本来可能会点赞这篇文章,但我认为在一个如此常用的类(System.String)上创建一个扩展方法没有任何意义,一个简单的静态方法已经足够了。让人不安的是似乎其他人也有同样的想法,过度使用扩展方法在不合适的地方似乎成了一种持续存在的迷恋。 - Aaronaught
2
扩展方法有什么不简单的地方?你会把静态方法放在哪里?我对静态方法的问题是它会导致类没有其他目的,只是为了保存本应该是扩展方法的帮助方法。 - dlras2
显示剩余2条评论

5

TryParse是一个静态方法。你不能重写静态方法。


最好的方式是用自己的辅助函数来完成这个任务吗? - dlras2
编写自己的字符串类型扩展方法。 - jsmith

3

TryParse是一个静态方法,您无法覆盖静态方法。

您可以尝试创建字符串的扩展方法以实现您想要的功能:

public static bool ParseYesNo(this string str, out bool val)
{
    if(str.ToLowerInvariant() == "yes")
    {
        val = true;
        return true;
    }
    else if (str.ToLowerInvariant() == "no")
    {
        val = false;
        return true;
    }

    return bool.TryParse(str, out val);
}

问题在于我想知道这个字符串是否是有效的布尔值 - true、false、yes、no、1、0。 "No" 是有效的布尔值,但它返回 false。 - dlras2
@cyclotis04 - 我更新了我的答案以更好地满足您的要求。 扩展方法现在的行为更像bool.TryParse()。 个人而言,我不是out参数的粉丝。 - Justin Niessner

2

你无法覆盖 TryParse。但是,你可以在 string 上创建一个扩展方法以方便使用。

public static class StringExtension
{
    public static bool TryParseToBoolean(this string value, bool acceptYesNo, out bool result)
    {
        if (acceptYesNo)
        {
            string upper = value.ToUpper();
            if (upper == "YES")
            {
                result = true;
                return true;
            }
            if (upper == "NO")
            {
                result = false;
                return true;
            }
        }
        return bool.TryParse(value, out result);
    }
}

然后,它将被这样使用:

public static class Program
{
    public static void Main(string[] args)
    {
        bool result;
        string value = "yes";
        if (value.TryParseToBoolean(true, out result))
        {
            Console.WriteLine("good input");
        }
        else
        {
            Console.WriteLine("bad input");
        }
    }
}

显然,我不是唯一一个建议这样做的人。 - Brian Gideon

1

这是不可能的。


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