杰基,
这是 Web 开发世界中非常常见的要求,正如您所指出的,没有内置的方法可以实现这一点,而且在最简单的情况下也存在不足。
@Chris 这些规则不是任意想象的。事实上,它们在处理用户输入时非常常见,尤其是在网络上。事实上,鉴于 ASP.NET 中的复选框会返回开/关(出于某种原因),布尔转换也很常见。
您有几个选择。一种是简单的方法,另一种是可扩展的解决方案。这一切都始于您希望在应用程序中使用此功能的方式。由于您没有详细说明您目前正在做什么或您希望如何做,因此我冒昧地做了一些假设。
主要假设是这些值通过 Request.Form 或 Request.QueryStrings(两者都是 NameValueCollections,可以为给定名称保存多个值)提供给您。
假设您想要一个名为 ChangeType 的方法,该方法给出了参数名称,并且您想要将其更改为的 Type 将返回值作为所需类型。所以方法签名可能如下所示:
public T ChangeType<T>(string parameterName, T defaultValue = default(T))
所以你可以像这样使用它:
int someId = ChangeType<int>("id", -1);
因此变量 someId 的值将是从 Request.Form 或 Request.QueryStrings 中提取的值,以 int 形式(如果存在)或 -1 如果不存在。
更完整的实现如下:
static T ChangeType<T>(string value) where T: struct
{
Type typeOft = typeof(T);
if (String.IsNullOrEmpty(value.Trim()))
return default(T);
if (typeOft == typeof(Int32))
return (T)ConvertToInt32(value);
else if (typeOft == typeof(Int64))
return (T)ConvertToInt64(value);
else if (typeOft == typeof(Double))
return (T)ConvertToDouble(value);
else if (typeOft == typeof(Decimal))
return (T)ConvertToDecimal(value);
return default(T);
}
static object ConvertToInt32(string value)
{
return Int32.Parse(value,
NumberStyles.Currency ^ NumberStyles.AllowDecimalPoint);
}
static object ConvertToInt64(string value)
{
return Int64.Parse(value,
NumberStyles.Currency ^ NumberStyles.AllowDecimalPoint);
}
static object ConvertToDouble(string value)
{
return Double.Parse(value, NumberStyles.Currency);
}
static object ConvertToDecimal(string value)
{
return Decimal.Parse(value, NumberStyles.Currency);
}
如果您需要能够处理更多类型,只需实现所需的方法(例如 ConvertToInt32)并在 ChangeType<T> 方法中添加另一个 else 条件即可。
现在,如果您正在寻找一种可扩展的解决方案,以便您可以添加额外的功能而无需修改主要代码并且能够处理您自己的自定义类型,那么请查看我的这篇博文。
[ChangeType – 在 C# 中更改变量的类型][1]
http://www.matlus.com/2010/11/changetypet-changing-the-type-of-a-variable-in-c/
希望对您有所帮助。