c# - 检查 String 是否可以转换为 C# 中的给定类型

标签 c# type-conversion

<分区>

我必须验证用户输入数据并确保字符串值可转换为运行时指定的类型。我不一定需要进行实际转换,只需测试以确保输入值有效即可。我还没有找到可以执行此类评估的内置类或方法,但如果我遗漏了一个,请告诉我。如果有任何版本特定的解决方案可用,我正在使用 C#4.0。

该方法只需要处理“标准”类型(内置值数据类型加上字符串)。我唯一需要评估的自定义类型是库中定义的特定枚举类型。

我目前正在权衡 2 个解决方案,但都不是完美的,所以我希望有第三个选项(或者我错过的框架内置的东西)。我非常倾向于解决方案 #2,因为在解决方案 #1 中使用 try-catch 似乎是错误的。

解决方案 1:Convert.ChangeType() 与 try/catch

public Boolean CheckType(String value, Type type)
{
    try
    {
        var obj = Convert.ChangeType(value, type);
        return true;
    }
    catch(InvalidCastException)
    {
        return false;
    }
    catch(FormatException)
    {
        return false;
    }
    catch(OverflowException)
    {
        return false;
    }
    catch(ArgumentNullException)
    {
        return false;
    }
}

解决方案 2 带类型检查和 TryParse 的 if/else 链

public Boolean CheckType(String value, Type type)
{
    if (type == typeof(String))
    {
        return true;
    }
    else if (type == typeof(Boolean))
    {
        Boolean b;
        return Boolean.TryParse(value, out b); 
    }
    else if (type == typeof(Int32))
    {
        Int32 i;
        return Int32.TryParse(value, out i); 
    }
    else if (type == typeof(Int64))
    {
        Int64 l;
        return Int64.TryParse(value, out l); 
    }
    // similar code to check all other types 
    // (Int16, UInt32, UInt64, UInt16, Byte, SByte, Single, Double, Decimal,
    //  Enum, Char, DateTime)
    .
    .
    .
    .
    .
    else
        throw new ArgumentException("Invalid type evaluation");

}

如果输入数据严重困惑或损坏,此方法可能会在短时间内被调用数百次甚至上千次,因此我担心重复的 if/else 检查会拖累性能(我我现在不一定要尝试优化,我只是想确保我正在考虑其他选项)。

我对这两种解决方案的另一个问题是,它们实际上都将字符串值转换为预期类型的​​新值,并且在这两种情况下,我都接受了结果。

最佳答案

我在另一个 question 中找到了比我最初的想法更好的解决方案这是最近被问到的。

parapura rajkumar 在 TypeConverter 类方面走在了正确的轨道上,但我试图避免对非异常事件的 CanConvertFrom 方法进行必要的异常处理。

TypeConverter.IsValid 方法解决了我的问题,尽管它并不理想,因为 IsValid 方法只是 CanConvertFrom 方法和所需异常处理的包装器。

private Boolean CanCovert(String value, Type type)
{
    TypeConverter converter = TypeDescriptor.GetConverter(type);
    return converter.IsValid(value);
}

关于c# - 检查 String 是否可以转换为 C# 中的给定类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8122604/

相关文章:

c# - 使用空属性 setter 时引发 Visual Studio 警告

c# - 隐式使用 null 参数作为良好代码风格的标志

C++ wstring 枚举

java - 使用 Java(或不使用)将 .xls 转换为 .pdf

c# - 如何忽略特定派生类的基类中的 'shared' NUnit 测试

c# - Xaml TextBlock 设置圆角

c# - 传输安全对于 Internet 上的 WCF 服务来说是一种不好的做法吗?

C++:重载运算符=

c++ - 转换重载函数不明确

c++ - 为什么可以将整数分配给字符串变量?