从未知源转换C#数据类型

从未知源转换C#数据类型,c#,types,C#,Types,在将字符串(通常)转换为其适当的数据类型时,似乎存在很多混淆,同时也在动态验证它。无论我在哪里看——博客、文章、代码示例、论坛。。一些人似乎有一种首选的处理这些场景的方法 案例通常是来自未知源的字符串/对象,如QueryString、会话/视图状态、WebService等 我见过许多不同的例子: 假设我们试图获取id=查询字符串,并将其作为整数在代码中使用。但是有人篡改了我们的URL并将其更改为 单向 int id = Convert.ToInt32(Request["id"]); // "I

在将字符串(通常)转换为其适当的数据类型时,似乎存在很多混淆,同时也在动态验证它。无论我在哪里看——博客、文章、代码示例、论坛。。一些人似乎有一种首选的处理这些场景的方法

案例通常是来自未知源的字符串/对象,如QueryString、会话/视图状态、WebService等

我见过许多不同的例子:

假设我们试图获取
id=
查询字符串,并将其作为整数在代码中使用。但是有人篡改了我们的URL并将其更改为

单向

int id = Convert.ToInt32(Request["id"]);
// "Input string was not in a correct format"
int id = (int)Request["id"];
// "Input string was not in a correct format"
int id = int.Parse(Request["id"]);
// "Input string was not in a correct format"
另一种方式

int id = Convert.ToInt32(Request["id"]);
// "Input string was not in a correct format"
int id = (int)Request["id"];
// "Input string was not in a correct format"
int id = int.Parse(Request["id"]);
// "Input string was not in a correct format"
还有另一种方式

int id = Convert.ToInt32(Request["id"]);
// "Input string was not in a correct format"
int id = (int)Request["id"];
// "Input string was not in a correct format"
int id = int.Parse(Request["id"]);
// "Input string was not in a correct format"
我曾经看到过这种情况(抛出异常并通知用户是有意义的)

最后一个,也是我个人使用的

int id = 0;
int.TryParse(Request["id"], out id);

// make sure it's not 0
if(id > 0) { // live a happy life }
这适用于所有其他类型,
bool
double
decimal
等等


请帮助我了解正确的方法是什么,因为我发现自己每天都在使用它。

首先,您应该使用:

int id;
if(!int.TryParse(Request["id"], out id)
    //notify the user, or handle it someother way
而不是检查id>0
int.TryParse(string,out int)
返回
true
如果解析成功,则返回
false


首先,您应该使用:

int id;
if(!int.TryParse(Request["id"], out id)
    //notify the user, or handle it someother way
而不是检查id>0
int.TryParse(string,out int)
返回
true
如果解析成功,则返回
false


我不认为这些都是“正确的”。我喜欢使用Convert.ToInt32(),因为我可以得到一些特定的异常,我可以检查这些异常是否是有效的输入。

我不认为这些异常实际上是“正确的”。我喜欢使用Convert.ToInt32(),因为我可以得到一些特定的异常,我可以检查这些异常是否是有效的输入。

正确:答案是,这取决于具体情况。您应该了解类型转换和解析之间的区别。适当地使用它们。

正确:答案是,这要看情况而定。您应该了解类型转换和解析之间的区别。适当地使用它们。

System.ComponentModel名称空间包含一个精心设计的框架,用于精确地执行这些类型的转换

自己检查名称空间,但这会让您开始:

targetType newValue = (targetType) System.ComponentModel.TypeDescriptor.GetDescriptor(typeof(sourceType))
    .ConvertTo((object)value, typeof(targetType))
您可以在一个集中的类型不可知的地方免费获得基本类型转换,而不必搜索在基本类型上发现的不幸不一致的X.Parse或X.TryParse方法


在基础之上,您可以得到一个可扩展的框架,您可以在其中编写自己的类型转换器。ASP.NET MVC框架大量使用此名称空间来处理其类型转换,例如查询字符串值转换为方法参数。

System.ComponentModel名称空间包含一个精心设计的框架,用于精确执行这些类型的转换

自己检查名称空间,但这会让您开始:

targetType newValue = (targetType) System.ComponentModel.TypeDescriptor.GetDescriptor(typeof(sourceType))
    .ConvertTo((object)value, typeof(targetType))
您可以在一个集中的类型不可知的地方免费获得基本类型转换,而不必搜索在基本类型上发现的不幸不一致的X.Parse或X.TryParse方法


在基础之上,您可以得到一个可扩展的框架,您可以在其中编写自己的类型转换器。ASP.NET MVC框架大量使用此名称空间来处理其类型转换,例如查询字符串值转换为方法参数。

谢谢@wawa,我不知道TryParse返回布尔值。谢谢@wawa,我不知道TryParse返回一个布尔值。但是你所有的场景都没有全面的答案。但是你所有的场景都没有全面的答案。这看起来真的很有趣@James,我会尝试找到更多关于它的信息。+1,我肯定这只是一个输入错误,newValue应该是targetType,同样的,ConvertTo()的结果的演员阵容这应该是TypeDescriptor.GetConverter而不是TypeDescriptor.GetDescriptor吗?这看起来真的很有趣@James,我将尝试查找更多关于它的信息。+1,我确信这只是一个输入错误,newValue应该是targetType,同样,ConvertTo()结果的强制转换这应该是TypeDescriptor.GetConverter而不是TypeDescriptor.GetDescriptor吗?正确的位置放置正确的东西。这就是为什么人们对Ruby/Python如此兴奋的原因!专注于行为和数据..类型可以在正确的地方为正确的事情处理。这就是为什么人们对Ruby/Python如此兴奋的原因!专注于行为和数据..类型可以在以后处理
Convert.ToInt32
生成与
int.Parse
相同的异常。相反,您应该依赖布尔返回的TryParse方法,因为异常不应驱动您的程序流。
Convert.ToInt32
生成与
int.Parse
。相反,您应该依赖于返回布尔值的TryParse方法,因为异常不应该驱动您的程序流。