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
。问题是关于普通铸造。