在反射和泛型中经常会使用到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. Redis五种基本数据结构

    1.字符串 示例: 2.列表 示例: 3.集合 示例: 4.散列 示例: 5.有序集合 待续...

  2. ASP.NET MVC Controllers and Actions

    MVC应用程序里的URL请求是通过控制器Controller处理的,不管是请求视图页面的GET请求,还是传递数据到服务端处理的Post请求都是通过Controller来处理的,先看一个简单的Contr ...

  3. java设计模式之建造者模式

    学习了设计模式,一直感觉有进步又没有进步,与同学.同事探讨了一下.变化不可能一会就可以的,需要努力坚持.不管进步大小,也不管是否进步,做到勿忘初心,做自己喜欢的事情就好.还有几个设计模式一直没有写,原 ...

  4. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  5. 使用jenkins配置.net mvc网站进行持续集成三

    前两篇讲解了Jenkins的配置和VS远程发布,现在还有一个问题,VS项目远程发布的时候,配置的是覆盖所有文件重生成的,而通常类似于配置文件这种东西,在本地开发环境和测试环境是不一样的.所以我们通常需 ...

  6. github fork后的pull和保持同步

    前言 对github上的某个项目贡献自己的修改,但自己可能并没有那个仓库的权限,那要如何操作呢?git的机制和svn还是有些区别的,本文做些记录. 思路1 clone项目到本地,有修改之后,直接提交到 ...

  7. Life

    24小时热水.24小时无线WiFi.24小时空调:有人陪你,不孤单,不寂寞,不瞎想,不停的传播正能量

  8. 数塔取数 基础dp

    从低端向上,每个结点取下一层左右结点最大值和本身价值相加,dp[0][0]为最后结果 #include<iostream> #include<algorithm> #inclu ...

  9. 【WPF】释放图像资源, [删除时报另一进程占用]

    源:zhantianyou CODE private BitmapImage ReturnBitmap(string destFile) { // Read byte[] from png file ...

  10. canvas-图片翻转

    图片90度翻转 在canvas中插入图片需先加载图片(利用Image对象);加载完成后再执行操作drawImage(obj,x,y,w,h) 插入图片的坐标宽高等值 <!DOCTYPE html ...