我在一个变量中存储了一个System.Type。我希望将对象的类型更改为此类型。
我有以下代码,但无法让type更改为该类型。
理想情况下,我希望:var intTest3 =(MyType)Convert.ChangeType(test, MyType);返回一个整数,当:MyType is a System.Int32
这是我到目前为止的工作--我哪里错了?
// 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);谢谢!
发布于 2010-03-01 21:50:24
这其实不是关于Convert.ChangeType的,而是关于角色选择的。您要转换的类型在编译时必须是已知的,尽管它可以是泛型类型。在这种情况下,就编译器而言,MyType可以引用任何类型。它并不“知道”它肯定会有typeof(int)的值,所以它不会只是对int进行强制转换。
在这种情况下,您希望intTest3的编译时类型是什么?
这里更大的图景是什么?你真正想做的是什么?您希望如何使用intTest3的值
发布于 2010-03-01 21:50:34
不应该是这样的。就C#而言,MyType不是一个“类型”,它是一个“类型”的变量。"MyType“的”类型“是”类型“,但不能将1转换为”类型“。
在这种情况下,你已经进入了“反思之地”,但你真的在试图找到一条出路。我很抱歉,但是没有办法从这种情况中回到强类型的领域。
但是,您可以尝试的一种解决方法是将最后一行移到另一个泛型方法中,然后以通用方式调用该方法:
public static void LeaveReflectionLand<T>(object value)
{
T newItem = (T)value;
}然后在外面,你必须做这样的事情:
this.GetType().GetMethod("LeaveReflectionLand", BindingFlags.Public | BindingFlags.Static).MakeGenericMethod(MyType).Invoke(null, test);但当然,这是一个巨大而可怕的变通方法。看看乔恩·斯基特的答案。我认为它把事情说得很清楚了。
它的长处和短处在于,因为MyType是类型类的一个实例,所以它可以表示任何类型。就编译器而言,它是一个和int一样的变量。它本身并不是一个真正的“类型”,而是一个“描述”类型的变量。因为它是一个描述类型的变量,所以在编译时,编译器不可能知道MyType所描述的实际类型,所以这种事情是不允许的。
这和做这样的事情没什么不同:
int test = 1;
int MyType = 2;
int anotherTest = (MyType)test;显然,你不能这样做。MyType是Int32类型的变量。当MyType的类型是类型时也是如此,只有在这种情况下MyType才是类型的变量。
理解这一点的关键是“类型类”和“编译器类型”之间的区别。
我希望这能帮到你。这不是用语言来解释的最简单的事情。
发布于 2010-03-01 21:49:57
MyType是一个Type,它是一个包含结构/类的定义信息的变量。通过将type放在方括号中进行转换,例如(int)value;,要求方括号中的项是实际的类或结构,而不是变量。
https://stackoverflow.com/questions/2356163
复制相似问题