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

    public static void Main(string[] args)
{
A a = new B
{
a = "a",
b = "b",
c = "c",
};
B c = new B
{
a = "a",
b = "b",
c = "c",
};
put(a);
put<A>(c);
put<B>(c);
put<IC>(c);
Console.ReadLine();
}
public static void put<T>(T t)
{ Type type1 = typeof(T);
Console.WriteLine();
Console.WriteLine("****************typeof*******************************");
foreach (var item in type1.GetProperties())
{
string name = item.Name;
string value = item.GetValue(t).ToString();
Console.WriteLine("name=" + name + ",value=" + value);
}
Console.WriteLine("****************GetType*******************************");
Type type2 = t.GetType(); foreach (var item in type2.GetProperties())
{
string name = item.Name;
string value = item.GetValue(t).ToString();
Console.WriteLine("name=" + name + ",value=" + value);
} } public class A
{
public string a { get; set; }
}
public interface IC
{
string c { get; set; }
}
public class B : A,IC
{
public string c { get; set; }
public string b { get; set; }
}

在看看代码的执行结果:

  发现一个问题 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()有什么妙用的,我们来看下一段代码:

    public static void Main(string[] args)
{
D d = new D
{
a = "a",
b = ,
d1 = new D1 { d1 = },
time = DateTime.Now,
};
put2(d);
Console.ReadLine();
}
public static void put2<T>(T t)
{
Type type1 = typeof(T);
Console.WriteLine();
PropertyInfo[] Properties = type1.GetProperties(); foreach (PropertyInfo item in Properties)
{
Console.WriteLine(item.GetType().FullName);
string name = item.Name;
object value = item.GetValue(t); Console.WriteLine("参数的命名空间为:" +value.GetType().FullName);
Console.WriteLine("name=" + name + ",value=" + value.ToString());
}
}
public class D
{
public string a { get; set; }
public int b { get; set; }
public DateTime time { get; set; }
private string c { get; set; }
public D1 d1 { get; set; } }
public class D1
{
public int d1 { get; set; }
public override string ToString()
{
return d1.ToString();
}
}

这段代码输出为:

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

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

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

C# GetType与typeof的更多相关文章

  1. c# 之 System.Type.GetType()与Object.GetType()与typeof比较

    Object.GetType()与typeof的区别 //运算符,获得某一类型的 System.Type 对象. Type t = typeof(int); //方法,获取当前实例的类型. ; Con ...

  2. c# GetType()和typeof()的区别

    c#   GetType()和typeof()的区别 C#中任何对象都具有GetType()方法,返回Type类型的当前对象的类型. GetType()是基类System.Object的方法,因此只有 ...

  3. C# GetType和typeof的区别

    typeof: The typeof operator is used to obtain the System.Type object for a type. 运算符,获得某一类型的 System. ...

  4. c#种GetType()和TypeOf()的区别

    C#中任何对象都具有GetType()方法,它的作用和typeof()相同,返回Type类型的当前对象的类型. typeof(x)中的x,必须是具体的类名.类型名称等,不可以是变量名称:GetType ...

  5. C#基础之GetType 与 typeof的区别

      C#中GetType 与 typeof的区别 在实际开发中经常需要了解具体对象的类型,所以经常会使用GetType()和typeof().尽管可以得到相应的类型.但两者之间也存在一些差别,接下来我 ...

  6. GetType() 和typeof() 的区别

    GetType() 非强类型,支持跨程序集发射,用来支持动态引用, A obja=new A(); Type t=obja.GetType() typeof() 强类型,静态的 Type t=type ...

  7. typeof,GetType

    typeof: 是运算符,获得某一类型的 System.Type 对象. Int32 t = new Int32(); Type t = typeof(int); GetType: 是方法,获取当前实 ...

  8. typeof与GetType

    typeof: The typeof operator is used to obtain the System.Type object for a type. 运算符,获得某一类型的 System. ...

  9. typeof与GetType区别及反射的见解

    http://www.cnblogs.com/knowledgesea/archive/2013/03/02/2935920.html http://www.cnblogs.com/Jax/archi ...

随机推荐

  1. MAC OS X El CAPITAN 搭建SPRING MVC (1)- 目录、包名、创建web.xml

    一. 下载STS(Spring Tool Suite) 官方地址:http://spring.io/tools/sts 下载spring tool suite for mac 最新版本.这个IDE是很 ...

  2. 一个基于Microsoft Azure、ASP.NET Core和Docker的博客系统

    2008年11月,我在博客园开通了个人帐号,并在博客园发表了自己的第一篇博客.当然,我写博客也不是从2008年才开始的,在更早时候,也在CSDN和系统分析员协会(之后名为“希赛网”)个人空间发布过一些 ...

  3. C#语言基础——函数

    函数一个较大的程序一般应分为若干个程序块,每一个模块用来实现一个特定的功能.所有的高级语言中都有子程序这个概念,用子程序实现模块的功能.在C#语言中,子程序的作用是由一个主函数和若干个函数构成.由主函 ...

  4. JAVA NIO FileChannel 内存映射文件

      文件通道总是阻塞式的. 文件通道不能创建,只能通过(RandomAccessFile.FileInputStream.FileOutputStream)getChannel()获得,具有与File ...

  5. NFS网络共享服务部署

    10.3 NFS服务端部署环境准备 10.3.1 NFS服务部署服务器准备 服务器系统 角色 IP Centos6.7 x86_64 NFS服务器端(NFS-server) 192.168.1.14 ...

  6. 浏览器js与css文件有缓存未更新致最新版本

    这是由于编码人员频繁更改引入的资源文件,浏览器中存在缓存,当你清空浏览器缓存也无济于事时可以采用在资源文件尾部加?_MM(MM为随机参数)即可强制更新资源文件.

  7. 搭建SVN服务器

    系统环境:CentOS 6.6   首先查看服务器上是否已安装了svn # rpm -qa subversion 如果没有安装,则执行此命令 # yum list subversion         ...

  8. Java基础知识笔记(八:集合类)

    目录 1  集合类简介  2  List介绍及简单使用 2.1  LinkedList介绍及简单使用 2.2  ArrayList介绍及简单使用 2.3  Vector介绍及简单使用 2.3.1  S ...

  9. Java的JDBC操作

    Java的JDBC操作 [TOC] 1.JDBC入门 1.1.什么是JDBC JDBC从物理结构上来说就是java语言访问数据库的一套接口集合,本质上是java语言根数据库之间的协议.JDBC提供一组 ...

  10. [LeetCode] Count of Smaller Numbers After Self 计算后面较小数字的个数

    You are given an integer array nums and you have to return a new counts array. The counts array has ...