我有一个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'时,它会在
处引发InvalidCastExceptionreturn (T)decodedValue;
关于我做错的任何想法?我通过使用泛型来使事情复杂化?
答案 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
投射到int
或double
。假设您实际上想要解析它,您应该从表单B返回一个字符串,表单A应该使用int.TryParse
或double.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转换为字符串,例如您必须转换。这个工具很方便,我用它做了一些事情。
尝试一下。
安德鲁