【问题标题】:Convert String to Type unknown at compile time在编译时将字符串转换为未知类型
【发布时间】:2019-10-10 03:17:43
【问题描述】:

给定一个字符串和一个数字类型,我想检查该字符串是否可以转换为该类型,并且如果可能的话希望将该字符串转换为该类型。 Bellow 是我想要做的事情的 sudo 代码:

public bool DataIsValid(string s, Type someNumType) {
    d = 0; // a class member double variable

    if (s.CanBeConvertedTo(someNumType)) {
        d = (double)s;
        return true;
    } else {
        return false;
}

我一直在尝试将字符串转换为某种类型的数字,但我不知道是什么类型。我尝试使用 try/catch 块与

d = (double)Convert.ChangeType(s, someNumType);

但这仅适用于双打。使用整数时,我会收到错误“System.InvalidCastException”。

我认为问题在于转换后将其转换回双精度(因为它适用于双精度而不是整数)。可能

object data = Convert.ChangeType(s, someNumType)
d = (double)data;

工作?

【问题讨论】:

  • 你可以试试trycast方法,如果转换成功与否,它会返回一个布尔值。如果您尝试转换为数字,那是整数吗?或者你的意思是它也可以是双倍的或浮动的?尝试转换为整数时的错误消息是什么?
  • 什么是 Convert.ChangeType 方法?您尝试过 TryCast 吗?
  • 在你的情况下,字符串总是一个数字? int 或 double 有什么意义?请给我们一个真实的例子好吗?
  • @Baahuali 一直在寻找如何使用 TryCast 的示例,但找不到。
  • 什么是可转换为int 但不能转换为double 的数字示例? shortbytefloat 怎么样?它们都不是很容易适应 double 吗?您的问题充其量也不清楚 - 您实际上想做什么,为什么确切的数据类型如此重要?

标签: c# string type-conversion


【解决方案1】:

您尝试使用typeof 运算符检查 if/switch 条件中的类型并相应地返回响应,如下所示:

public bool DataIsValid(string s, Type someNumType) {
d = 0; // a class member variable

   if(someNumType == typeof(int))
   {
     d = int.Parse(s);
     return true;
   }
   if(someNumType == typeof(double))
   {
     d = double.Parse(s);
     return true;
   }
   if(someNumType == typeof(decimal))
   {
     d = decimal.Parse(s);
     return true;
   }

   return false;
}

【讨论】:

  • 这是一个解决方案,我同意这一点,但在他的情况下,他说边的尺寸是双倍的,边数是整数。在他的情况下,我会将所有内容都视为双精度,因为同一类型之间的数学运算将避免隐式转换。
【解决方案2】:

如果我了解您想要做什么,您可以通过使用带有IConvertible 约束的通用方法来使用ChangeType

它需要两个参数:

  • 要转换的字符串,
  • 要更改为out的数据值。

所以我们使用一个简单的try - ChangeType - catch来进行操作。

/// <summary>
/// Get a value from a string and return true if success
/// else return false if not convertible
/// </summary>
/// <typeparam name="T">The generic type parameter</typeparam>
/// <param name="str">The string to convert</param>
/// <param name="value">The value to get</param>
/// <returns>The converted value if success else the default of the type</returns>
public bool GetValueFromString<T>(string str, out T value)
  where T : IConvertible
{
  try
  {
    value = (T)Convert.ChangeType(str, typeof(T));
    return true;
  }
  catch
  {
    value = default(T);
    return false;
  }
}

测试:

void Test()
{
  int valueInt = 0;
  double valueDouble = 0;
  Console.WriteLine("DataIsValid<int>(text) : " + GetValueFromString("text", out valueInt));
  Console.WriteLine("DataIsValid<int>(-4) : " + GetValueFromString("-4", out valueInt));
  Console.WriteLine("DataIsValid<int>(4) : " + GetValueFromString("4", out valueInt));
  Console.WriteLine("DataIsValid<int>(4,3) : " + GetValueFromString("4,3", out valueInt));
  Console.WriteLine("DataIsValid<double>(text) : " + GetValueFromString("text", out valueDouble));
  Console.WriteLine("DataIsValid<double>(-4) : " + GetValueFromString("-4", out valueDouble));
  Console.WriteLine("DataIsValid<double>(4) : " + GetValueFromString("4", out valueDouble));
  Console.WriteLine("DataIsValid<double>(4,3) : " + GetValueFromString("4,3", out valueDouble));
}

输出:

DataIsValid<int>(text) : False
DataIsValid<int>(-4) : True
DataIsValid<int>(4) : True
DataIsValid<int>(4,3) : False
DataIsValid<double>(text) : False
DataIsValid<double>(-4) : True
DataIsValid<double>(4) : True
DataIsValid<double>(4,3) : True

【讨论】:

    【解决方案3】:

    我设法使用以下方法实现了我想要的:

    public bool DataIsValid(string s, Type someType) {
        o = 0; // a class member object variable
    
        try { o = Convert.ChangeType(s, someType); }
        catch { return false; }
    
        return true;
    }
    
    //using the object variable
    double someDouble = (double)0;
    //some more code
    

    感谢您的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多