我正在使用泛型进行动态投射,并且在从long
投射到int
时遇到了问题。问题基本归结为以下几点:
虽然这有效:
long l = 10;
int i = (int) l;
这不是:
long l = 10;
object o = l;
int i = (int)o;
所以问题是我有一个对象作为object
类型的变量,但后面的实例是long
类型,我想把它转换为int
。到目前为止我发现的是这篇文章:Representation and identity (Eric Lippert)。
那么有效的是:
long l = 10;
object o = l;
int i = (int)(long)o;
我试过的是:
long l = 10;
object o = l;
int i = (int) Convert.ChangeType(o, typeof(long));
但这不起作用。现在的问题是如何在没有System.InvalidCastException
的情况下动态投射?
目前我有这个(它不起作用):
public T Parse<T>(object value){
return (T) Convert.ChangeType(value, value.GetType());
}
如何使其工作并能够使用T long
传递int
类型的对象。
答案 0 :(得分:1)
而不是:
long l = 10;
object o = l;
int i = (int) Convert.ChangeType(o, typeof(long));
只需要Convert
给你一个int
,就像你想要的那样:
long l = 10;
object o = l;
int i = (int) Convert.ChangeType(o, typeof(int));
Convert
类使用IConvertable
界面为您进行转换。
使用这种方法,您可以像这样编写Parse
函数:
T Parse<T>(object value)
{
return (T) Convert.ChangeType(value, typeof(T));
}
并称之为:
long l = 10;
object o = l;
int i=Parse<int>(o);
答案 1 :(得分:0)
long
到int
是类型转换,当你这样做时,你只是将一种类型的值更改为另一种类似的类型,在某些情况下可能会导致价值损失,编译器知道如何这样做。
object
到int
是类型转换。您正试图更改基础类型。因此 runtime
错误。
答案 2 :(得分:0)
这个怎么样
return (T) TypeDescriptor.GetConverter(typeof(T)).ConvertFromString(value.ToString());
如果你的长值对于一个int太大而仍然会失败,那么你仍然需要处理它。
看看这个 Generic TryParse