首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >通用TryParse

通用TryParse
EN

Stack Overflow用户
提问于 2010-06-03 05:16:31
回答 23查看 88.2K关注 0票数 209

我正在尝试创建一个泛型扩展,它使用'TryParse‘来检查字符串是否为给定类型:

代码语言:javascript
复制
public static bool Is<T>(this string input)
{
    T notUsed;
    return T.TryParse(input, out notUsed);
}

这将无法编译,因为它无法解析符号“TryParse”

据我所知,'TryParse‘不是任何接口的一部分。

这到底有没有可能做到?

更新:

使用下面的答案,我想出了:

代码语言:javascript
复制
public static bool Is<T>(this string input)
{
    try
    {
        TypeDescriptor.GetConverter(typeof(T)).ConvertFromString(input);
    }
    catch
    {
        return false;
    }

    return true;
}

它工作得很好,但我认为以这种方式使用异常对我来说是不正确的。

Update2:

修改为传递类型而不是使用泛型:

代码语言:javascript
复制
public static bool Is(this string input, Type targetType)
{
    try
    {
        TypeDescriptor.GetConverter(targetType).ConvertFromString(input);
        return true;
    }
    catch
    {
        return false;
    }
}
EN

回答 23

Stack Overflow用户

回答已采纳

发布于 2010-06-03 05:23:49

您应该使用TypeDescriptor类:

代码语言:javascript
复制
public static T Convert<T>(this string input)
{
    try
    {
        var converter = TypeDescriptor.GetConverter(typeof(T));
        if(converter != null)
        {
            // Cast ConvertFromString(string text) : object to (T)
            return (T)converter.ConvertFromString(input);
        }
        return default(T);
    }
    catch (NotSupportedException)
    {
        return default(T);
    }
}
票数 202
EN

Stack Overflow用户

发布于 2011-07-02 06:11:04

我最近还需要一个通用的TryParse。这是我想出来的;

代码语言:javascript
复制
public static T? TryParse<T>(string value, TryParseHandler<T> handler) where T : struct
{
    if (String.IsNullOrEmpty(value))
        return null;
    T result;
    if (handler(value, out result))
        return result;
    Trace.TraceWarning("Invalid value '{0}'", value);
    return null;
}

public delegate bool TryParseHandler<T>(string value, out T result);

然后简单地调用thusly就可以了:

代码语言:javascript
复制
var value = TryParse<int>("123", int.TryParse);
var value2 = TryParse<decimal>("123.123", decimal.TryParse);
票数 81
EN

Stack Overflow用户

发布于 2012-04-12 04:30:52

使用try/catches进行流控制是一个糟糕的策略。抛出异常会导致性能延迟,而运行时会绕过该异常。而是在转换之前验证数据。

代码语言:javascript
复制
var attemptedValue = "asdfasdsd";
var type = typeof(int);
var converter = TypeDescriptor.GetConverter(type);
if (converter != null &&  converter.IsValid(attemptedValue))
    return converter.ConvertFromString(attemptedValue);
else
    return Activator.CreateInstance(type);
票数 33
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2961656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档