首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Convert.ChangeType到System.Type

Convert.ChangeType到System.Type
EN

Stack Overflow用户
提问于 2010-03-01 21:45:28
回答 3查看 4.2K关注 0票数 0

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

我有以下代码,但无法让type更改为该类型。

理想情况下,我希望:var intTest3 =(MyType)Convert.ChangeType(test, MyType);返回一个整数,当:MyType is a System.Int32

这是我到目前为止的工作--我哪里错了?

代码语言:javascript
复制
        // 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);

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-01 21:50:24

这其实不是关于Convert.ChangeType的,而是关于角色选择的。您要转换的类型在编译时必须是已知的,尽管它可以是泛型类型。在这种情况下,就编译器而言,MyType可以引用任何类型。它并不“知道”它肯定会有typeof(int)的值,所以它不会只是对int进行强制转换。

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

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

票数 2
EN

Stack Overflow用户

发布于 2010-03-01 21:50:34

不应该是这样的。就C#而言,MyType不是一个“类型”,它是一个“类型”的变量。"MyType“的”类型“是”类型“,但不能将1转换为”类型“。

在这种情况下,你已经进入了“反思之地”,但你真的在试图找到一条出路。我很抱歉,但是没有办法从这种情况中回到强类型的领域。

但是,您可以尝试的一种解决方法是将最后一行移到另一个泛型方法中,然后以通用方式调用该方法:

代码语言:javascript
复制
public static void LeaveReflectionLand<T>(object value)
{
     T newItem = (T)value;
}

然后在外面,你必须做这样的事情:

代码语言:javascript
复制
this.GetType().GetMethod("LeaveReflectionLand", BindingFlags.Public | BindingFlags.Static).MakeGenericMethod(MyType).Invoke(null, test);

但当然,这是一个巨大而可怕的变通方法。看看乔恩·斯基特的答案。我认为它把事情说得很清楚了。

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

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

代码语言:javascript
复制
int test = 1;
int MyType = 2;
int anotherTest = (MyType)test;

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

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

我希望这能帮到你。这不是用语言来解释的最简单的事情。

票数 4
EN

Stack Overflow用户

发布于 2010-03-01 21:49:57

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2356163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档