2010-03-01 20 views
0

我有一个System.Type存储在一个变量。我希望将对象的类型更改为此类型。Convert.ChangeType到System.Type

我有以下代码,但无法获取类型更改为类型。

理想情况下,我想:var intTest3 =(MyType)Convert.ChangeType(test, MyType);返回一个int,当: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); 

谢谢!

回答

2

这不是真的关于Convert.ChangeType - 这是关于铸造。您正在投射的类型必须在编译时间处已知,但它可能是通用类型。在这种情况下,就编译器而言,MyType可以参考的任何类型。它不会“知道”它肯定会有价值typeof(int),所以它不会仅仅投射到int

在这种情况下,您希望intTest3的编译时类型是什么?

这里的大图是什么?你真的想做什么?您希望如何使用intTest3的值?

+0

这不是对问题的最好解释,特别是因为类型是硬编码的。 – cjk 2010-03-01 13:52:52

+0

我正在翻译2个API之间的数据。一个API提供一个包含数据的对象和一个包含这些数据的System.Type的变量。这些是在编译时设置的。 其他API要求任何输入是“正确的类型” - 所以我不能只发送对象,但是,如果对象的类型是“Int32”,那么它需要一个Int32变量。 所以我想这个问题是“如何将一个对象转换为一种类型,这只在运行时才知道”。 – bob 2010-03-01 14:16:56

+0

@bob:你会期待这样的演员要做什么?你会如何使用结果?假设“var”不存在,因为它在这里不是真正相关的,否则你将如何声明intTest3?你可以使用泛型方法吗? (如果需要的话,可以让你在'typeof(T)'中传递给'T'到'ConvertType')。如果你可以发布更完整的代码来使用你想要的任何东西,那将会有帮助。 – 2010-03-01 14:26:36

0

MyType是一个Type,它是一个包含struct/class定义信息的变量。将type置于括号内例如铸造。 (int)value;要求括号中的项目是实际的类或结构,而不是变量。

4

这不应该。就C#而言,MyType不是“类型”,而是“Type”类型的变量。 “MyType”的“类型”是“类型”,但不能投1到“类型”。

在这种情况下,您已经进入了“reflection-land”,但您确实想要找到出路。我很抱歉,但是没有办法从这种情况下回到强类型的土地上。

一种解决方法,你可以尝试但做的,是一般移动最后一行到另一个通用的方法,然后调用方法:

public static void LeaveReflectionLand<T>(object value) 
{ 
    T newItem = (T)value; 
} 

然后从外面,你必须这样做这个:

this.GetType().GetMethod("LeaveReflectionLand", BindingFlags.Public | BindingFlags.Static).MakeGenericMethod(MyType).Invoke(null, test); 

但当然,这是一个巨大而可怕的解决方法。检查乔恩Skeet的答案...我认为它把事情清楚。

它的长和短,因为MyType是Type类的一个实例,它可以代表任何类型。就编译器而言,它就像int一样。它本身并不是一个合适的“类型”,它是一个“描述”类型的变量。因为它是一个描述类型的变量,所以在编译时,编译器无法知道MyType描述的实际类型,所以这种事情是不允许的。

这不是不像做这样的事情:

int test = 1; 
int MyType = 2; 
int anotherTest = (MyType)test; 

显然,你不能做到这一点。 MyType是Int32类型的变量。当MyType的类型是Type时也是如此,只有在这种情况下,MyType是Type类型的变量。

理解这一点的关键是“Type类”和“编译器类型”之间的区别。

我希望这会有所帮助。用文字解释并不是最容易的事情。

+0

非常清楚 - 谢谢! – bob 2010-03-01 14:09:17

相关问题