C# 使用对象实例将具有泛型的从long转换为int
我使用泛型动态转换,在从C# 使用对象实例将具有泛型的从long转换为int,c#,generics,casting,C#,Generics,Casting,我使用泛型动态转换,在从long转换到int时遇到了一个问题。问题基本上归结为以下几点: 虽然这样做有效: long l = 10; int i = (int) l; 这并不是: long l = 10; object o = l; int i = (int)o; 所以问题是,我有一个对象作为变量,类型为object,但后面的实例类型为long,我想将其转换为int。到目前为止,我发现的是这篇文章: 因此,有效的方法是: long l = 10; object o = l;
long
转换到int
时遇到了一个问题。问题基本上归结为以下几点:
虽然这样做有效:
long l = 10;
int i = (int) l;
这并不是:
long l = 10;
object o = l;
int i = (int)o;
所以问题是,我有一个对象作为变量,类型为object
,但后面的实例类型为long
,我想将其转换为int
。到目前为止,我发现的是这篇文章:
因此,有效的方法是:
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));
我尝试的是:
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解析(对象值){
return(T)Convert.ChangeType(value,value.GetType());
}
如何使其工作并能够通过T being
int
long
将long
类型的对象传递到int
是类型转换,当您这样做时,您只是将一种类型的值更改为另一种类似类型,在某些情况下可能会导致值丢失,编译器知道如何执行此操作
object
到int
是类型转换。您正在尝试更改基础类型。因此出现了运行时错误
看看&这个怎么样
return (T) TypeDescriptor.GetConverter(typeof(T)).ConvertFromString(value.ToString());
如果您的long值对于int来说太大,那么它仍然会失败,因此您仍然需要处理这个问题
看看这个
而不是这个:
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);
T解析(对象值)
{
return(T)Convert.ChangeType(value,typeof(T));
}
这样称呼它:
T Parse<T>(object value)
{
return (T) Convert.ChangeType(value, typeof(T));
}
long l = 10;
object o = l;
int i=Parse<int>(o);
长l=10;
对象o=l;
int i=解析(o);
我不明白。您找到了一种可行的方法(将对象强制转换为其原始类型),但您似乎希望以更复杂的方式进行转换?另外,您不担心从64位整数变为32位整数时可能会丢失数据吗?您不能只说返回(t)值代码>@ChristophKn否,它将抛出InvalidCastException。@user1666620否我不担心数据丢失。(事实上,我正在使用int值,但由于某些原因,在通过Signal r WebSocket进行通信时,会将它们作为长类型值接收。但这不是问题的范围。)您确定要使用Convert.ChangeType(value,typeof(T))
?使用value.GetType()
是不可操作的。我不知道该类型是什么,所以我将其引用为对象
,即使实际实例的类型为long
。问题是关于普通铸造。