将.ChangeType转换为System.Type

时间:2010-03-01 13:45:28

标签: c#

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

我有以下代码,但无法将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);

谢谢!

3 个答案:

答案 0 :(得分:4)

不应该这样。就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);

但当然,这是一个巨大而可怕的解决方法。检查Jon Skeet的回答......我认为它清楚地说明了问题。

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

这与做这样的事情没有什么不同:

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

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

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

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

答案 1 :(得分:2)

这不是关于Convert.ChangeType - 它是关于施法的。您要投射的类型必须在编译时中知道,尽管它可能是泛型类型。在这种情况下,就编译器而言MyType可以引用任何类型。它不会“知道”它肯定会具有值typeof(int),所以它不会仅仅向int发出强制转换。

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

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

的值

答案 2 :(得分:0)

MyType是Type,它是一个包含struct / class定义信息的变量。通过将type放入括号中进行投射,例如(int)value;要求括号中的项目是实际的类或结构,而不是变量。