使用泛型来转换不同的用户输入类型

时间:2009-04-01 08:04:36

标签: c# generics

我有一个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中,有两个字段需要允许数据输入,一个是Quantity(int),另一个是Price(double)。我想允许表单B适应不同的类型,因此这就是我使用泛型的原因。

因此,当接受表格B时,它将返回表格A并使用以下代码

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

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

这是发生错误的地方,当调用函数'formB.GetDecodedValue'时,它会在

处引发InvalidCastException
return (T)decodedValue;

关于我做错的任何想法?我通过使用泛型来使事情复杂化?

4 个答案:

答案 0 :(得分:4)

TypeConverter可能是您最好的选择:

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

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

还有:

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

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

答案 1 :(得分:2)

我认为在这里使用泛型不仅仅是从表单A进行强制转换,但这不是问题。问题是返回的值不是正确的类型。这是一个字符串,您无法从string投射到intdouble。假设您实际上想要解析它,您应该从表单B返回一个字符串,表单A应该使用int.TryParsedouble.TryParse,适当地处理用户输入错误。

(假设Ink.Strokes.ToString()返回诸如“5”或“10.50”之类的文本 - 我不能立即知道情况就是这样。)

答案 2 :(得分:1)

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

答案 3 :(得分:1)

试试这个:

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

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

尝试一下。

安德鲁