.NET-分析不带结果的数据类型

.NET-分析不带结果的数据类型,.net,parsing,types,.net,Parsing,Types,是否可以解析数据类型int、double、boolean。。。在.NET中不引发异常也不返回结果?换句话说,我只想回答“这是一个有效的整数吗?”或“这是一个有效的双精度数吗?”这样的问题,而不必声明一个结果变量。我不想使用.TryParse,因为我必须传入一个结果变量,我不想使用.Parse,因为它会抛出 有什么建议吗?如果.NET中没有这个功能,我会感到惊讶,我一定是遗漏了什么 编辑 好吧,这太容易了。。。刚刚做了一些扩展方法,我在路上…… <Extension()> _

是否可以解析数据类型int、double、boolean。。。在.NET中不引发异常也不返回结果?换句话说,我只想回答“这是一个有效的整数吗?”或“这是一个有效的双精度数吗?”这样的问题,而不必声明一个结果变量。我不想使用.TryParse,因为我必须传入一个结果变量,我不想使用.Parse,因为它会抛出

有什么建议吗?如果.NET中没有这个功能,我会感到惊讶,我一定是遗漏了什么

编辑

好吧,这太容易了。。。刚刚做了一些扩展方法,我在路上……
    <Extension()> _
    Public Function IsValidInteger(ByVal value As String) As Boolean
        Dim result As Integer
        Return Integer.TryParse(value, result)
    End Function

    <Extension()> _
    Public Function IsValidDouble(ByVal value As String) As Boolean
        Dim result As Double
        Return Double.TryParse(value, result)
    End Function
看起来这是一个重复的问题,但是,老实说,我直到现在才发现这个问题:

这个问题的公认答案可能比这里建议的任何答案都要好。

您可以使用在类型上定义的不同TryParse方法

这是您在不编写自己的解析器/标记器的情况下所能做的最好的事情。

您可以使用在类型上定义的不同TryParse方法


这是您在不编写自己的解析器/标记器的情况下所能做的最好的事情。

是的,为这做您自己的扩展方法,这些方法不存在,因为它不是人们每天使用的东西

public bool有效此int someInt,字符串为check { 国际不需要; 返回Int.TryParsetoCheck,不需要退出;
}

是的,为此创建您自己的扩展方法,这些方法不存在,因为它不是人们每天使用的东西

public bool有效此int someInt,字符串为check { 国际不需要; 返回Int.TryParsetoCheck,不需要退出;
}

如果您只是想避免这种情况,您可以为自己编写一种扩展方法,这种方法比每次都使用TryParse更方便。比如:

public static bool IsValidDateFormat(this string s)
{
    DateTime dt;
    return DateTime.TryParse(s, out dt);
}

也许有一种更优雅的方法可以做到这一点,我只是把它放在一起以便于编译。

你可以自己编写一个扩展方法,它比每次都使用TryParse更方便,如果你想避免的话。比如:

public static bool IsValidDateFormat(this string s)
{
    DateTime dt;
    return DateTime.TryParse(s, out dt);
}

也许有一种更优雅的方法可以做到这一点,我只是把它放在一起以便于编译。

我认为框架中没有任何东西可以做到这一点。正如Guffa指出的那样,在框架中提供这种方法的用途有限

但如果您真的愿意,可以编写一个基于约定的扩展方法,如:

public static class ParseExtensions
{
    public delegate bool TryParser<T>(string input, out T result);

    public static bool CanParseTo<T>(this string text, TryParser<T> tryParser)
    {
        if (text == null)
            throw new ArgumentNullException("text");

        if (tryParser == null)
            throw new ArgumentNullException("tryParser");

        T result;
        return tryParser(text, out result);
    }
}
用法很遗憾类型推断在这里不起作用:

bool intTrue = "123".CanParseTo<int>(int.TryParse);
bool intFalse = "xxx".CanParseTo<int>(int.TryParse);

bool enumTrue = "Encrypted".CanParseTo<FileOptions>(Enum.TryParse<FileOptions>);
bool enumFalse = "xxx".CanParseTo<FileOptions>(Enum.TryParse<FileOptions>);

bool dateTimeTrue = "2004/05/05".CanParseTo<DateTime>(DateTime.TryParse);
bool dateTimeFalse = "xxx".CanParseTo<DateTime>(DateTime.TryParse);

我认为这个框架中没有任何东西。正如Guffa指出的那样,在框架中提供这种方法的用途有限

但如果您真的愿意,可以编写一个基于约定的扩展方法,如:

public static class ParseExtensions
{
    public delegate bool TryParser<T>(string input, out T result);

    public static bool CanParseTo<T>(this string text, TryParser<T> tryParser)
    {
        if (text == null)
            throw new ArgumentNullException("text");

        if (tryParser == null)
            throw new ArgumentNullException("tryParser");

        T result;
        return tryParser(text, out result);
    }
}
用法很遗憾类型推断在这里不起作用:

bool intTrue = "123".CanParseTo<int>(int.TryParse);
bool intFalse = "xxx".CanParseTo<int>(int.TryParse);

bool enumTrue = "Encrypted".CanParseTo<FileOptions>(Enum.TryParse<FileOptions>);
bool enumFalse = "xxx".CanParseTo<FileOptions>(Enum.TryParse<FileOptions>);

bool dateTimeTrue = "2004/05/05".CanParseTo<DateTime>(DateTime.TryParse);
bool dateTimeFalse = "xxx".CanParseTo<DateTime>(DateTime.TryParse);

不,框架中没有这样的功能

原因是,与实际解析字符串相比,仅确定字符串是否可解析几乎没有什么好处,因此不值得同时使用这两种方法

几乎总是当您想知道是否可以解析字符串时,您还需要解析字符串。如果有一种方法可以确定是否可以解析字符串,那么它经常会以这种方式被误用,导致字符串被解析两次:

if (Int32.CanParse(theString)) {
  int n = Int32.Parse(theString);
}

TryParse方法只需一次操作即可完成,而且它也适用于非常特殊的情况,只需为结果声明一个变量即可带来不便。

不,框架中没有此类功能

原因是,与实际解析字符串相比,仅确定字符串是否可解析几乎没有什么好处,因此不值得同时使用这两种方法

几乎总是当您想知道是否可以解析字符串时,您还需要解析字符串。如果有一种方法可以确定是否可以解析字符串,那么它经常会以这种方式被误用,导致字符串被解析两次:

if (Int32.CanParse(theString)) {
  int n = Int32.Parse(theString);
}

TryParse方法只需一次操作即可完成此操作,而且它也适用于非常罕见的情况,只需为结果声明一个变量即可带来不便。

请尝试以下功能:

public bool isValid<T>(object t)
{
    try
    {
        Convert.ChangeType(t, typeof(T));
        return true;
    }
    catch(Exception e)
    {
        return false;
    }
}
您不需要为每个基本类型组合编写扩展,因为此方法是泛型的。例如:

bool isValidInt = isValid<int>("t14");
//isValidInt == false
bool isValidInt2 = isValid<int>("144");
//isValidInt2 == true

请尝试以下功能:

public bool isValid<T>(object t)
{
    try
    {
        Convert.ChangeType(t, typeof(T));
        return true;
    }
    catch(Exception e)
    {
        return false;
    }
}
您不需要为每个基本类型组合编写扩展,因为此方法是泛型的。例如:

bool isValidInt = isValid<int>("t14");
//isValidInt == false
bool isValidInt2 = isValid<int>("144");
//isValidInt2 == true

TryParse与您将要得到的一样好……为什么TryParse如此不便?@Colin-因为需要向它传递一个结果变量。也许我会看看下面提到的这些所谓的“扩展方法”。当创建一种特定于领域的语言时,扩展方法非常有用,因为它们使您能够更好地控制代码的语义,从而使事情能够被扩展
以一种更为商业直观的方式呈现。你在这里是如何避免特里帕斯的?您只需将其包装在扩展方法中。TryParse将尽可能好…为什么TryParse如此不便?@Colin-因为需要向其传递一个结果变量。也许我会看看下面提到的这些所谓的“扩展方法”。在创建特定于领域的语言时,扩展方法非常有用,因为它们可以让您更好地控制代码的语义,从而以更直观的商业方式来表达。您在这里如何避免TryParse?您只是简单地将它包装在扩展方法中,初始化dt没有意义,因为这样您就可以将它用作输出parameter@Tim罗宾逊:说得好。毕竟,它没有被用于任何用途。更新。初始化dt没有任何意义,因为您将它用作输出parameter@Tim罗宾逊:说得好。毕竟,它没有被用于任何用途。已更新。显然,您不必编写自己的解析器/标记器,只需使用这些神奇的扩展方法即可。@Oceanic7:Magic?这只是一个开放/封闭的原则,加上一些语法上的糖分使之更容易。显然,你不必编写自己的解析器/标记器,你只需要使用这些神奇的扩展方法。@Oceanic7:Magic?这只是一个开放/封闭的原则,加上一些语法上的糖分,使之更容易一些。