ChangeType,Convert - 从一种类型转换为另一种类型

时间:2010-11-08 07:21:58

标签: .net types

我已经看过.NET框架上似乎可用的各种选项(我认为)。特别是,我看过了 1. TypeConverter 2. Convert.Toxxx 3. Convert.ChangeType

由于某种原因,他们每个人都不适合我。我很惊讶.NET框架中似乎没有针对此类问题的解决方案。我假设我不是唯一需要这个的人;)

这是我正在尝试做的事情。基本上,我有一堆在应用程序中使用的html表单。这些表单允许用户输入数据(显然),我需要将这些数据提取到各种数据类型中。

这些数据类型是简单类型,基本类型,值类型,引用类型和自定义引用类型。换一种说法: 1. Int32,Int64,double,decimal,DateTime等。 2. Int32 [],double [],string []以及可能的其他基本类型数组 3.具有上述类型属性的各种自定义DTO对象。

“输入”是字符串的形式,因为我在Http的土地上。为了让您了解现有解决方案为何对我不起作用,请查看以下需要转换的“字符串”输入

  1. “1,234” - > INT32
  2. “$ 1,234” - > Int32
  3. “$ 1,234” - > INT32
  4. “” - > INT32
  5. “1,2,3,4,5” - > Int32 []
  6. “0”或“false”或“False”或“off” - >布尔值
  7. 我知道如何手动转换这些案例,但我正在寻找一些我错过的框架内容或处理上面列出的输入类型的合适解决方案。

2 个答案:

答案 0 :(得分:1)

所有原始类型(如int和bool)都有TryParse static method可供您使用。这将为你做Int32的东西:

Int32 temp = 0;
Int32.TryParse(myStringInput, out temp);

TryParse()返回一个布尔值,指示解析是否成功,所以你可以测试它并在你想要的时候采取行动,或者就像我上面那样做,并且如果{ {1}}失败。 TryParse特别有用,因为它失败时不抛出异常(它只返回TryParse)。

false不会直接将数字bool.TryParse()翻译为0 - 您需要先将其转换为字符串:

false

将字符串值 off 转换为布尔值将需要您自己的函数来解释它。

答案 1 :(得分:1)

济,

这是Web开发领域的一个非常常见的要求,正如您所指出的那样,没有内置的方法来实现这一目标,在最简单的情况下,有什么不足之处。

@Chris这些规则并不是任何想象力的任意镜头。事实上,在处理用户输入时,尤其是在网络上,它们非常普遍。事实上,布尔转换也很常见,因为ASP.NET中的复选框会打开/关闭(由于某种原因)。

你有几个选择。一种是简单的方法,另一种是可扩展的解决方案。这一切都始于您希望在应用程序中使用此功能的方式。既然你没有充分了解你目前正在做什么,或者你想如何做到这一点,我就冒昧做了一些假设。

主要假设是值通过Request.Form或Request.QueryStrings(两者都是NameValueCollections,可以为给定名称保存多个值)来为您提供。

假设您想要一个名为ChangeType的方法,该方法给出了参数的名称,而您希望将其更改为的类型将返回值作为所需类型。所以方法签名可能如下所示:

public T ChangeType<T>(string parameterName, T defaultValue = default(T))

所以你可以像这样使用它:

int someId = ChangeType<int>("id", -1);

因此,变量some​​Id的值将是以int形式(如果存在)从Request.Form或Request.QueryStrings中提取的值,如果不存在则为-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>方法中添加其他条件就可以了。

现在,如果您正在寻找可扩展的解决方案,以便您可以添加其他功能而无需修改主代码并且无法处理自己的自定义类型,那么请查看我的博客文章。 [ChangeType - 在C#中更改变量的类型] [1] http://www.matlus.com/2010/11/changetypet-changing-the-type-of-a-variable-in-c/

希望这有助于。