类型转换的问题

loachqz 2009-10-29 03:47:17
请问,如果知道了某个类型的FullName,如何将object类型转成该指定类型!?
...全文
220 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
ProjectDD 2009-10-30
  • 打赏
  • 举报
回复
//X x;
x.GetType().FullName;


object o=(object)x;
var v=o as X;
cc_net 2009-10-29
  • 打赏
  • 举报
回复
[Quote=引用 42 楼 wanghui0380 的回复:]
引用 39 楼 cc_net 的回复:
引用 38 楼 wanghui0380 的回复:
引用 36 楼 cc_net 的回复:
Control con=new Form();  在堆上的对象指向的类型对象还是Form,只是栈上的易用类型是Control

Form frm=(Form)con; 实际堆上的对象指向的类型对象还是Form,只是引用变了

这还真不知道改怎么说。


这个只能叫成员方法表的转换,实际上对象还是对象,换了一个马甲而已(嘿嘿,穿了马甲是赵本山,把马甲脱了还是赵本山)


一个对象在初始化的时候,他的方法表地址就已经确定了。对于非虚方法,是根据栈上的变量类型来调用方法,所以它调用的方法的地址也是编译时就确定了。而和堆上运行时的实际类型无关,所以说成员方法表的转换不妥。




这位老兄还是先看看《你必须知道的net》把,知道new的时候都发生了什么事吗??如果编译的时候就确定了,new的时候还需要层层冒泡去在内存分配父类的成员方法表吗???

按你的说法,编译的时候就确定了,难道你心里想的就像博客园那位“吉日”兄一样,认为程序运行前,系统会把所有的对象类型的方法表一口气载入内存,明显不是如此的,方法表虽然在编译的时候被固定的结构,但是他实际是临时动态滴加载到内存里的


好了不说了,再说就和lz这个帖子偏题太远了


ps:提示lz一下,并不需要你去写太多if else, 你所要做的事情微软已经做了Convert.ChangeType方法就是,他提供了net里默认的常用类型的互译。按你的需求来看,实际这些常用过程就够用了
[/Quote]

不好意思,是我说的不清楚,我说的编译是指JIT编译。不是编译成IL代码的时候。
# 0000003c mov ecx,esi
# 0000003e cmp dword ptr [ecx],ecx
# 00000040 call FFB2C050
# 00000045 nop

这篇文章挺不错,看过多次,推荐,深入探索.NET框架内部了解CLR如何创建运行时对象:http://www.microsoft.com/china/MSDN/library/netFramework/netframework/JITCompiler.mspx?mfr=true
怫悰 2009-10-29
  • 打赏
  • 举报
回复
本来就存在显式和隐式转换吧?不过还是要确定能否转成功吆
wanghui0380 2009-10-29
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 cc_net 的回复:]
引用 38 楼 wanghui0380 的回复:
引用 36 楼 cc_net 的回复:
Control con=new Form();  在堆上的对象指向的类型对象还是Form,只是栈上的易用类型是Control

Form frm=(Form)con; 实际堆上的对象指向的类型对象还是Form,只是引用变了

这还真不知道改怎么说。


这个只能叫成员方法表的转换,实际上对象还是对象,换了一个马甲而已(嘿嘿,穿了马甲是赵本山,把马甲脱了还是赵本山)



一个对象在初始化的时候,他的方法表地址就已经确定了。对于非虚方法,是根据栈上的变量类型来调用方法,所以它调用的方法的地址也是编译时就确定了。而和堆上运行时的实际类型无关,所以说成员方法表的转换不妥。


[/Quote]

这位老兄还是先看看《你必须知道的net》把,知道new的时候都发生了什么事吗??如果编译的时候就确定了,new的时候还需要层层冒泡去在内存分配父类的成员方法表吗???

按你的说法,编译的时候就确定了,难道你心里想的就像博客园那位“吉日”兄一样,认为程序运行前,系统会把所有的对象类型的方法表一口气载入内存,明显不是如此的,方法表虽然在编译的时候被固定的结构,但是他实际是临时动态滴加载到内存里的


好了不说了,再说就和lz这个帖子偏题太远了


ps:提示lz一下,并不需要你去写太多if else, 你所要做的事情微软已经做了Convert.ChangeType方法就是,他提供了net里默认的常用类型的互译。按你的需求来看,实际这些常用过程就够用了
conan19771130 2009-10-29
  • 打赏
  • 举报
回复
mark
zhanlang9075 2009-10-29
  • 打赏
  • 举报
回复
关键是要把等号右边的类型  转换为可以与左边类型匹配的数据类型 是这样的程序思路么
cc_net 2009-10-29
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 wanghui0380 的回复:]
引用 36 楼 cc_net 的回复:
Control con=new Form();  在堆上的对象指向的类型对象还是Form,只是栈上的易用类型是Control

Form frm=(Form)con; 实际堆上的对象指向的类型对象还是Form,只是引用变了

这还真不知道改怎么说。


这个只能叫成员方法表的转换,实际上对象还是对象,换了一个马甲而已(嘿嘿,穿了马甲是赵本山,把马甲脱了还是赵本山)
[/Quote]


一个对象在初始化的时候,他的方法表地址就已经确定了。对于非虚方法,是根据栈上的变量类型来调用方法,所以它调用的方法的地址也是编译时就确定了。而和堆上运行时的实际类型无关,所以说成员方法表的转换不妥。

wanghui0380 2009-10-29
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 cc_net 的回复:]
Control con=new Form();  在堆上的对象指向的类型对象还是Form,只是栈上的易用类型是Control

Form frm=(Form)con; 实际堆上的对象指向的类型对象还是Form,只是引用变了

这还真不知道改怎么说。
[/Quote]

这个只能叫成员方法表的转换,实际上对象还是对象,换了一个马甲而已(嘿嘿,穿了马甲是赵本山,把马甲脱了还是赵本山)
cc_net 2009-10-29
  • 打赏
  • 举报
回复
我觉得应该是类型转换,因为在初始化时,堆上对象的类型已经就确定。这个是不能改的。
cc_net 2009-10-29
  • 打赏
  • 举报
回复
Control con=new Form(); 在堆上的对象指向的类型对象还是Form,只是栈上的易用类型是Control

Form frm=(Form)con; 实际堆上的对象指向的类型对象还是Form,只是引用变了

这还真不知道改怎么说。
loachqz 2009-10-29
  • 打赏
  • 举报
回复
。。。。谢谢大家。只能用最原始的方法了。类型不是很多,就直接if判断吧
CsToD 2009-10-29
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 viena 的回复:]
21楼,就算不是拆箱,但你说的类型转换也不对
对象实际类型没有发生变化,只不过从object引用,改为了其本身类型的引用
何来类型转换?
[/Quote]
Control con=new Form();
Form frm=(Form)con;
在你看来,这不是类型转换?

对象虽然没转换,但是引用发生了变化,这在你看来不叫转换?
viena 2009-10-29
  • 打赏
  • 举报
回复
你这样转换的话,可能不会报错,但是可能取到的值是错的~
loachqz 2009-10-29
  • 打赏
  • 举报
回复
我试试wanghui0380的提议。自己写转换方法去调用。。再不行,貌似就通过已知类型判断写。。
本人特别不喜欢if或者switch。。呵呵~
loachqz 2009-10-29
  • 打赏
  • 举报
回复
我试试wanghui0380的提议。自己写转换方法去调用。。再不行,貌似就通过已知类型判断写。。
本人特别不喜欢if或者switch。。呵呵~
viena 2009-10-29
  • 打赏
  • 举报
回复
我认为只能分已知类型一一判断,
如果并非所有类型都可以统一转换的,强制转换的话,
可能会有驴唇不对马嘴的结果,以后出了错你都不知道是哪出的~
loachqz 2009-10-29
  • 打赏
  • 举报
回复
bjtiantian哥哥。。反射我也会。问题我不是要调方法。。。。辛苦你了
wanghui0380 2009-10-29
  • 打赏
  • 举报
回复
问法稍微有点问题,is关系才能说类型转换

非is关系只能叫convert(转变,实际我愿意把他叫做,翻译)

请自己参阅Convert.ChangeType() 方法,当然这个方法实现了大部分默认类型的互译
如果有非支持的转换其会报异常,对于这种你就必须用 Convert<Tinput,Toutput>或者fun<T,Tresult>
自己提供转换支持了
viena 2009-10-29
  • 打赏
  • 举报
回复
另: 我早已不是版主了
viena 2009-10-29
  • 打赏
  • 举报
回复
21楼,就算不是拆箱,但你说的类型转换也不对
对象实际类型没有发生变化,只不过从object引用,改为了其本身类型的引用
何来类型转换?
加载更多回复(25)

111,119

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧