博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# GetType与typeof
阅读量:6005 次
发布时间:2019-06-20

本文共 3940 字,大约阅读时间需要 13 分钟。

  在反射和泛型中经常会使用到Type类,获取Type的最常用的方法是 obj.GetType(),和typeof(T)。在获取泛型的type时有些小坑。

在看看代码的执行结果:

  发现一个问题 GetType 和typeof的结果不一样。put<T>(T t)    显而易见,在传入相同的对象不同泛型  t.GetType()的返回值是确定的,而typeof(T)是可以变化的。obj.GetType()和定义obj的类型没有直接的关系,它的返回值是 YYYY obj = new XXXX() ; XXXX的类型,不一定是YYYY的类型。typeof就不用多说了

所以在此处代码应该写typeof(T),而不是t.GetType(),不然就失去泛型的意思。

GetType()有什么妙用的,我们来看下一段代码:

1    public static void Main(string[] args) 2         { 3             D d = new D 4             { 5                 a = "a", 6                 b = 1, 7                 d1 = new D1 { d1 = 1 }, 8                 time = DateTime.Now, 9             };10             put2(d);11             Console.ReadLine();12         }13         public static void put2
(T t)14 {15 Type type1 = typeof(T);16 Console.WriteLine();17 PropertyInfo[] Properties = type1.GetProperties();18 19 foreach (PropertyInfo item in Properties)20 {21 Console.WriteLine(item.GetType().FullName);22 string name = item.Name;23 object value = item.GetValue(t);24 25 Console.WriteLine("参数的命名空间为:" +value.GetType().FullName);26 Console.WriteLine("name=" + name + ",value=" + value.ToString());27 }28 }29 public class D30 {31 public string a { get; set; }32 public int b { get; set; }33 public DateTime time { get; set; }34 private string c { get; set; }35 public D1 d1 { get; set; }36 37 }38 public class D139 {40 public int d1 { get; set; }41 public override string ToString()42 {43 return d1.ToString();44 }45 }

这段代码输出为:

  这段代码的21行是输出item的命名空间,结果却是RuntimePropertyInfio不是定义的PropertyInfio。并且RuntimePropertyInfio这个类是不可以访问的。简单的推测出RuntimePropertyInfio 类的修饰词可能是private或者是internal,而且这个类是继承了PropertyInfio,同时也能推测出继承PropertyInfio的类绝对不是这一种。这个是c#源码中常用的一些手段。

  再来看item.getValue(t)中 在源码中的返回值是object,

而我们却而已通过GetType() 获得类具体的命名空间,通过这些方法就可以处理不用的参数。

 

转载于:https://www.cnblogs.com/linxingxunyan/p/6242439.html

你可能感兴趣的文章
uiscrollview 图片放大缩小
查看>>
JavaWeb三大组件—过滤器filter
查看>>
凡是可能出错的事必定会出错
查看>>
css选择器
查看>>
谈谈PHP网站的防SQL注入
查看>>
解析Java中静态变量与实例变量的区别
查看>>
java基础(三)-----java的三大特性之多态
查看>>
ASP.NET状态管理之五(查询字苻串QueryString)
查看>>
zookeeper api和zkclient api使用
查看>>
编写一个带有main函数的类,调用上面的汽车类,实例化奔驰、大众、丰田等不同品牌和型号,模拟开车过程:启动、加速、转弯、刹车、息火,实时显示速度。...
查看>>
MVC框架中的值提供机制(二)
查看>>
json字符串使用注意问题
查看>>
(二)Ribbon(负载均衡的客户端)+Rest
查看>>
清洗洗衣机
查看>>
springBoot中碰见的问题
查看>>
java基础
查看>>
人民的名义评论
查看>>
基于 CSS3 Media Queries 的 HTML5 应用
查看>>
表单的理解
查看>>
linux下yum安装指定的mysql版本
查看>>