![](/img/trans.png)
[英]Generic Type Converter - TypeConverter or Convert.ChangeType
[英]Convert.ChangeType to System.Type
我有一个存储在变量中的System.Type。 我希望将对象的类型更改为此类型。
我有以下代码,但无法将Type更改为type。
理想情况下,我想要: var intTest3 =(MyType)Convert.ChangeType(test, MyType);
当: MyType is a System.Int32
时,返回一个int
到目前为止,这是我的工作-我哪里出错了?
// object to cast to int
object test = 1;
// INT32 type
Type MyType = typeof(System.Int32);
// explicit type int WORKS
var intTest = (int)Convert.ChangeType(test, typeof(Int32));
// explicit type to int WORKS
var intTest2 = (int)Convert.ChangeType(test, MyType);
// explicit type to int WORKS - but as object
object intTest3 = Convert.ChangeType(test, MyType);
// cast to my type DOESNT WORK
var intTest3 =(MyType)Convert.ChangeType(test, MyType);
谢谢!
不应该这样 就C#而言,MyType不是“类型”,它是“ Type”类型的变量。 “ MyType”的“ type”是“ Type”,但是不能将1强制转换为“ Type”。
在这种情况下,您已经进入“反射区”,但实际上您正在尝试寻找出路。 很抱歉,但是无法从这种情况返回强类型土地。
但是,您可以尝试执行的一种解决方法是将最后一行移到另一个通用方法中,然后以通用方式调用该方法:
public static void LeaveReflectionLand<T>(object value)
{
T newItem = (T)value;
}
然后从外面,您必须执行以下操作:
this.GetType().GetMethod("LeaveReflectionLand", BindingFlags.Public | BindingFlags.Static).MakeGenericMethod(MyType).Invoke(null, test);
但是,当然,这是一个巨大而可怕的解决方法。 检查乔恩·斯凯特(Jon Skeet)的答案...我认为这很清楚。
它的长短是,因为MyType是Type类的实例,所以它可以表示任何类型。 就编译器而言,它是一个与int一样的变量。 它本身不是一个适当的“类型”,而是一个“描述”类型的变量。 因为它是一个描述类型的变量,所以在编译时,编译器无法知道MyType所描述的实际类型,因此这种事情是不允许的。
这与执行以下操作没有什么不同:
int test = 1;
int MyType = 2;
int anotherTest = (MyType)test;
显然,您不能这样做。 MyType是Int32类型的变量。 当MyType的类型为Type时也是如此,仅在这种情况下MyType是Type类型的变量。
理解这一点的关键是“类型类”和“编译器类型”之间的区别。
我希望这有帮助。 用言语解释不是最容易的事情。
这实际上与Convert.ChangeType
无关-与强制转换有关。 您要转换的类型必须在编译时就知道了,尽管它可能是通用类型。 在这种情况下,就编译器而言, MyType
可以引用任何类型。 它并不“知道”它肯定具有值typeof(int)
,因此它不会仅仅将类型转换为int
。
在这种情况下,您期望intTest3
的编译时类型是什么?
这里的大局是什么? 你到底想干什么? 您将如何使用intTest3
的值?
MyType是一个Type
,它是一个包含结构/类的定义信息的变量。 通过将type
放在方括号中进行转换,例如(int)value;
要求方括号中的项目是实际的类或结构,而不是变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.