知道了Type,如何将object转换类型是该Type对象的实例??

pptiwen 2013-12-11 12:02:14
假如我一个Type对象t,
然后有一个object o,
现在根据布尔表达式:t==o.GetType()
true:
则转换将o转换为类型为t的对象。
false:
无操作。

因为t是动态获取,可能任意类的Type对象,非固定某一类型。
因此无法如此:if(o is XXX)
也不是t.InvokeMember(...);因为这个转换是传输所必须的,我不需要它内部成员调用。

其实就是我写了一个公共方法,使用反射进行构造实例,并PropertyInfo.SetValue,我只知道传进来的Type对象,和一些其他参数(均为object),现在就判断假如存在一个集合属性(List<T>,只考虑这种集合),则需要根据参数构建List<T>(参数的实际引用并不一定是T也可能是T的派生类)
由于Type对象不固定,集合中的<T>也不确定,所以就犯难在这里了。

不求一定去解答题目中所问,能有更好的设计,我更加佩服。
...全文
9031 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
meiyanfei 2016-08-27
  • 打赏
  • 举报
回复 1
object o; type t; //把 o 转换成类型 t ,这样可以吗? o = Convert.ChangeType(o, t);
daving2010 2015-03-29
  • 打赏
  • 举报
回复
引用 3 楼 u011384967 的回复:
曹版主说了那么多,讲了很多基础,其实楼主并未明白,你不可能将object按照Type对象转换成对应的类型对象。因为Type做为类型的模板,它本身可以通过InvokeMember方法(除此之外,还有其他多种反射创建实例的方法)来构造这种类型的实例对象并以object返回(为什么返回object?因为其一:虽然Type对象知道它描述的是哪种类型,但是方法返回却不可能指定为某一种类型,必然为所有类型的超集。其二:反射能够反射编译后的程序元数据文件中(元数据定义表),却不能访问(元数据引用表),所以你虽然知道是哪种类型,却不能找到类型指令,导致编译器无法调用类型指令(VS代码编辑器中的关键字以及类型名都属于编译器指令))。 虽然返回的是object,但是实际引用一直是Type对象所描述的类型对象。故在属性赋值时,只要object的实际引用的类型和属性的类型兼容(as 转换可成功,或者实现了转换重载等),必然会赋值成功。 实际上,你只需要System.Activator.CreateInstance(p.PropertyType),这样保证你赋值成功,记住,就目前来说,除非微软更新,否则永远不要考虑题目中的问题。
难道是我设计不对,我的需求中需要那个类型来确定泛型函数的类型参数<T>。怎么解决啊?确切的说是泛型函数的<T>可以我能指定具体类型Class1给他,但是函数内部有个泛型字段,需要的类型参数也是Class1,但是这个字段被元数据约束为class,意味着泛型函数内的这个泛型字段必须指定具体类型Class1,这样我就难办了,本来这个泛型函数我想适合所有类型,但内部字段必须要我指定具体类型,难道不能根据泛型函数的类型参数T来确定具体类型吗,来传递给内部的泛型字段当作具体类型参数。
wangyongligood 2015-01-30
  • 打赏
  • 举报
回复
object obj = this; Type ty= obj.GetType(); if (ty.Name.Equals("Form1")) { Form1 f = (Form1)obj; }
pptiwen 2013-12-13
  • 打赏
  • 举报
回复
引用 3 楼 u011384967 的回复:
曹版主说了那么多,讲了很多基础,其实楼主并未明白,你不可能将object按照Type对象转换成对应的类型对象。因为Type做为类型的模板,它本身可以通过InvokeMember方法(除此之外,还有其他多种反射创建实例的方法)来构造这种类型的实例对象并以object返回(为什么返回object?因为其一:虽然Type对象知道它描述的是哪种类型,但是方法返回却不可能指定为某一种类型,必然为所有类型的超集。其二:反射能够反射编译后的程序元数据文件中(元数据定义表),却不能访问(元数据引用表),所以你虽然知道是哪种类型,却不能找到类型指令,导致编译器无法调用类型指令(VS代码编辑器中的关键字以及类型名都属于编译器指令))。 虽然返回的是object,但是实际引用一直是Type对象所描述的类型对象。故在属性赋值时,只要object的实际引用的类型和属性的类型兼容(as 转换可成功,或者实现了转换重载等),必然会赋值成功。 实际上,你只需要System.Activator.CreateInstance(p.PropertyType),这样保证你赋值成功,记住,就目前来说,除非微软更新,否则永远不要考虑题目中的问题。
碉堡了,解决了我很久以来的疑惑!,谢谢!
Phoozyan 2013-12-13
  • 打赏
  • 举报
回复 1
曹版主说了那么多,讲了很多基础,其实楼主并未明白,你不可能将object按照Type对象转换成对应的类型对象。因为Type做为类型的模板,它本身可以通过InvokeMember方法(除此之外,还有其他多种反射创建实例的方法)来构造这种类型的实例对象并以object返回(为什么返回object?因为其一:虽然Type对象知道它描述的是哪种类型,但是方法返回却不可能指定为某一种类型,必然为所有类型的超集。其二:反射能够反射编译后的程序元数据文件中(元数据定义表),却不能访问(元数据引用表),所以你虽然知道是哪种类型,却不能找到类型指令,导致编译器无法调用类型指令(VS代码编辑器中的关键字以及类型名都属于编译器指令))。 虽然返回的是object,但是实际引用一直是Type对象所描述的类型对象。故在属性赋值时,只要object的实际引用的类型和属性的类型兼容(as 转换可成功,或者实现了转换重载等),必然会赋值成功。 实际上,你只需要System.Activator.CreateInstance(p.PropertyType),这样保证你赋值成功,记住,就目前来说,除非微软更新,否则永远不要考虑题目中的问题。
kunkun0921 2013-12-11
  • 打赏
  • 举报
回复
直接转换啊,比如有一个数值型的object对象,可以直接转换Convert.ToInt32(obj), 或者其他类型比如Student,直接用Student stu=obj as Student或者Student stu=(Student)obj;
threenewbee 2013-12-11
  • 打赏
  • 举报
回复
类型是编译器识别的东西,如果你在写代码的时候知道类型,或者类型的基类,你可以直接用as或强制类型转换 比如 object o = 32; IConverable c = o as IConvertable; or int c = (int)o; 如果这个类型在你写程序的时候没有,只好一直用反射了。在语法上你没有办法用一个类型和它关联。不过你可以用dynamic,其实它相当于反射,不过编译器不会检查这个对象是否合法,直接编译,比如 object o = new { id = 1, name = "a" }; dynamic d = o; int i = d.id; // right d.id = 3; // wrong, because its readonly d.abcd = "aaa"; // wrong, not such a property 注意这些错误只能运行的时候发现。使用dynamic可以绕过编译器检查。 你也可以结合两者访问集合,比如 object o = ...; foreach (dynamic d in o as IEnumerable) { Console.WriteLine(d.Name); } (前提是o本身是一个List<T>)
Transformer发轫于NLP(自然语言处理),并跨界应用到CV(计算机视觉)领域。 Swin Transformer是基于Transformer的计算机视觉骨干网,在图像分类、目标检测、实例分割、语义分割等多项下游CV应用中取得了SOTA的性能。该项工作也获得了ICCV 2021顶会最佳论文奖。本课程将手把手地教大家使用labelme标注和使用Swin Transformer训练自己的数据集进行图片和视频的实例分割。  本课程将介绍Transformer及在CV领域的应用、Swin Transformer的原理。 本课程以汽车驾驶场景图片和视频开展项目实践:对汽车行驶场景中的路坑、车、车道线进行物体标注和实例分割。  课程在Windows和Ubuntu系统上分别做项目演示。包括:安装软件环境、安装Pytorch、安装Swin-Transformer-Object-Detection、标注自己的数据集、准备自己的数据集、数据集格式转换(Python脚本完成)、修改配置文件、训练自己的数据集、测试训练出的网络模型、性能统计、日志分析。  本课程提供项目的数据集和相关Python程序文件。相关课程: 《Transformer原理与代码精讲(PyTorch)》https://edu.csdn.net/course/detail/36697《Transformer原理与代码精讲(TensorFlow)》https://edu.csdn.net/course/detail/36699《ViT(Vision Transformer)原理与代码精讲》https://edu.csdn.net/course/detail/36719《DETR原理与代码精讲》https://edu.csdn.net/course/detail/36768《Swin Transformer实战目标检测:训练自己的数据集》https://edu.csdn.net/course/detail/36585《Swin Transformer实战实例分割:训练自己的数据集》https://edu.csdn.net/course/detail/36586《Swin Transformer原理与代码精讲》 https://download.csdn.net/course/detail/37045

110,477

社区成员

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

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

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