【问题标题】:Using generics to cast different user input types使用泛型来转换不同的用户输入类型
【发布时间】:2009-04-01 16:09:13
【问题描述】:

我有一个 Windows 应用程序,它允许从平板电脑上的笔输入进行输入。

当需要时,一个表单 (A) 将打开另一个表单 (B) 以允许用户输入。

在表格(B)中,我有以下函数来返回用户用笔输入的解码值。

private object decodedValue;

public T GetDecodedValue<T>()
{
    return (T)decodedValue;
}

当用户输入一个值时,在表单B中,我将结果存储如下

string sResult = myInkCollector.Ink.Strokes.ToString();
decodedValue = (object)sResult;

现在在表格 A 中需要两个字段来允许数据输入,一个是数量 (int),另一个是价格 (double)。我想让表单 B 适应不同的类型,因此这就是我使用泛型的原因。

所以当表单B被接受时,它会返回表单A并使用以下代码

int qty = formB.GetDecodedValue<int>();

double price = formB.GetDecodedValue<double>();

这是发生错误的地方,当调用函数“formB.GetDecodedValue”时,它会在以下位置引发 InvalidCastException

return (T)decodedValue;

关于我做错了什么有什么想法吗?我使用泛型使事情复杂化了?

【问题讨论】:

    标签: c# generics


    【解决方案1】:

    TypeConverter 可能是你最好的选择:

    return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFrom(decodedValue);
    

    这通常适用于 string 值 - 除此之外...... hit'n'miss。

    还有:

    return (T)Convert.ChangeType(decodedValue, typeof(T));
    

    工作方式不同;两个都试试;-p

    【讨论】:

      【解决方案2】:

      我不认为在这里使用泛型比从表单 A 进行强制转换更干净,但这不是问题。问题是返回的值不是正确的类型。这是一个字符串,您不能将string 转换为intdouble。假设你真的想解析它,你应该从表单 B 返回一个字符串,表单 A 应该使用int.TryParsedouble.TryParse,适当地处理用户输入错误。

      (这是假设 Ink.Strokes.ToString() 返回诸如“5”或“10.50”之类的文本 - 我并不清楚情况是否如此。)

      【讨论】:

        【解决方案3】:

        您不能将字符串转换为 int 或 double,您需要使用 int.Parse 或 double.Parse。

        【讨论】:

        【解决方案4】:

        试试这个:

        return (T)Convert.ChangeType(decodedValue, typeof(T));
        

        您不能将 int 隐式转换为字符串,例如必须转换。这个工具很方便,我已经用它做了一些事情。

        试试看。

        安德鲁

        【讨论】:

          猜你喜欢
          • 2014-07-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-16
          相关资源
          最近更新 更多