Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 测试字符串是否可以转换为其他各种类型_C#_Visual Studio 2010_.net 4.0 - Fatal编程技术网

C# 测试字符串是否可以转换为其他各种类型

C# 测试字符串是否可以转换为其他各种类型,c#,visual-studio-2010,.net-4.0,C#,Visual Studio 2010,.net 4.0,(已解决)我正在构建一个应用程序,该应用程序可以根据XML文件中的一些描述动态创建一些控件。 我现在需要的是与TryParse()方法非常相似的东西:检查(wihtout抛出/捕获异常)字符串变量中的文本是否可以转换(或解析)为类型,我在其他变量(myType)中的名称。 问题是myType可以是任何.NET类型:DateTime、Bool、Double、Int32等 例如: string testStringOk = "123"; string testStringWrong = "hello

(已解决)我正在构建一个应用程序,该应用程序可以根据XML文件中的一些描述动态创建一些控件。
我现在需要的是与TryParse()方法非常相似的东西:检查(wihtout抛出/捕获异常)字符串变量中的文本是否可以转换(或解析)为类型,我在其他变量(
myType
)中的名称。
问题是
myType
可以是任何.NET类型:
DateTime、Bool、Double、Int32

例如:

string testStringOk = "123";
string testStringWrong = "hello";
string myType = "System.Int32";

bool test1 = CanCovertTo(testStringOk, myType);      //true
bool test2 = CanCovertTo(testStringWrong, myType);   //false
CanCovertTo(stringteststring,stringtesttype)
函数应该是什么样子的

我得到的最接近的代码如下:

private bool CanCovertTo(string testString, string testType)
{
    Type type = Type.GetType(testType, null, null);
    TypeConverter converter = TypeDescriptor.GetConverter(type);

    converter.ConvertFrom(testString);  //throws exception when wrong type
    return true;
}
但是,它在尝试从错误的字符串转换时抛出异常,我不希望为此使用
try{}catch()


解决方案:

private bool CanCovertTo(string testString, string testType)
{
    Type type = Type.GetType(testType, null, null);
    TypeConverter converter = TypeDescriptor.GetConverter(type);
    return converter.IsValid(testString);
}
我会检查方法,尽管:

从.NETFramework版本4开始,IsValid方法捕获CanConvertFrom和ConvertFrom方法的异常。如果输入值类型导致CanConvertFrom返回false,或者如果输入值导致ConvertFrom引发异常,IsValid方法将返回false


这意味着,如果您自己不使用try…catch,您将转换两倍的值。

而不是将类型作为字符串传递,您应该使用泛型,例如

public bool CanConvert<T>(string data)
{
    TypeConverter converter = TypeDescriptor.GetConverter(typeof(T));
    return converter.IsValid(data);
}
public bool CanConvert(字符串数据)
{
TypeConverter converter=TypeDescriptor.GetConverter(typeof(T));
返回converter.IsValid(数据);
}
用法

bool test1 = CanConvert<Int32>("1234"); // true
bool test2 = CanConvert<Int32>("hello"); // false
bool test1=CanConvert(“1234”);//真的
bool test2=CanConvert(“你好”);//假的

如果它们只是内置的.NET类型,则可以基于System.TypeCode进行转换。您可以将类型代码存储在XML中(或将类型字符串转换为类型代码),并执行以下操作:

switch (code)
{
    case TypeCode.Boolean:
        bool.TryParse(value, out result);
        break;
    case TypeCode.Int32:
        int.TryParse(value, out result);
    ...
}

为什么不使用try/catch呢?为什么要转换名为CanConvert的函数中的值?你不能只做“return converter.CanConvertFrom(typeof(string))”@PVitt:这只是关于“最佳实践”,我已经读到你应该避免在正常程序操作中使用异常。我相信这就是为什么TryParse()方法与Parse()同时存在的原因。老实说,如果有比这更好的方法,可以让我做我需要的事情,我更喜欢那一种@Grrbrr404:你说得对,
CanConvertFrom(typeof(string))
在该代码中不是必需的。我修改了post.Similiar,类似于我之前提出的一个问题:泛型要求OP知道编译类型的类型,而他似乎不知道。如果我之前知道确切的类型,或者可以这样做,那将是完美的:
bool test1=CanConvert(testStringOk)我不知道类型,但是,它是动态读取的,并且保留在字符串中是可变的。@詹姆斯:您能使用
类型
对象作为泛型类型参数吗?”?我认为这是不可能的。@psubsee2003-可以使用反射来完成,但是,我发布的内容完全错误!删除了,我已经有一段时间没有使用泛型了,所以有点生锈了!回答得很好。这实际上解决了我上周问的一个问题。我一直在思考这个问题,但这句话太多了。:)使用TypeConverter.IsValid,可以用3行代码完成。无论如何,谢谢你:)