首页 > 学院 > 开发设计 > 正文

反射 介绍System.Type类

2019-11-17 02:27:19
字体:
来源:转载
供稿:网友

反射 介绍System.Type类

本节先介绍system.Type类,通过这个类可以访问关于任何数据类型的信息。

1. system.Type类以前把Type看作一个类,但它实际上是一个抽象的基类。只要实例化了一个Type对象,实际上就实例化了Typc的一个派生类。尽管一般情况下派生类只提供各种Type方法和属性的不同重载,但是这些方法和属性返回对应数据类型的正确数据,Type有与每种数据类型对应的派生类。  通常,获取指向任何给定类型的Type引用有3种常用方式:(1) 使用C#的typeof运算符

Typef = typeof(double)

(2) 使用GetType()方法,所有的类都会从system.object继承这个方法。

double d = 10;Type t = d.GetType();

(3) 还可以调用Type类的静态方法GetTypeO:

Type t = Type。GetType("system.Double");

Type是许多反射功能的入口 。注意,可用的属性都是只读的:可以使用Type确定数据的类型,但不能使用它修改该类型!2. Type属性

3. 方法

system.Type的大多数方法都用于获取对应数据类型的成员信息:构造函数、属性、方法和事件等。它有许多方法,但它们都有相同的模式。例如,有两个方法可以获取数据类型的方法的细节信息:GetMethodO和GetMethods. GetMethods方法返回System.Reflection.MethodInfo对象的一个引用,其中包含一个方法的细节信息。GetMethods()返回这种引用的一个数组。其区别是GetMethods()方法返回所有方法的细节信息;而GetMethod()方法返回一个方法的细节信息,其中该方法包含特定的参数列表。这两个方法都有重载方法,重载方法有一个附加的参数,即BindingFlags枚举值,该值表示应返回哪些成员,例如,返回公有成员、实例成员和静态成员等。

举例:

方法:

GetMember()和GetMembers()方法返回数据类型的任何成员或所有成员的详细信息,不管这些成员是构造函数、属性和方法等。

4. C#反射结合System.Type类实例

namespace myNameSpace  {      class PRogram      {          static void Main(string[] args)          {              /* TypeView示例 star */                            Type t = typeof(myClass);                            AnalyzeType(t);                            /* TypeView示例 end */                Console.ReadLine();          }            //定义嵌套类myClass          class myClass          {              private string _my;                public string My              {                  get { return _my; }                  set { _my = value; }              }          }            //通过System.Type类提供的方法分析类中的成员信息          static void AnalyzeType(Type t)          {              //当前成员名              Console.WriteLine(t.Name);            //myClass              //完全限定名,包含命名空间              Console.WriteLine(t.FullName);        //myNameSpace.myClass              //命名空间              Console.WriteLine(t.Namespace);       //myNameSpace                //获取直接继承的类              Type tBase = t.BaseType;                if (tBase != null)              {                  Console.WriteLine(tBase.Name);      //Object              }                //该类公共语言运行库提供的类型              Type tUnderlyingSystem = t.UnderlyingSystemType;                if (tUnderlyingSystem != null)              {                  Console.WriteLine(tUnderlyingSystem.Name);      //myClass              }                //返回当前类型的所有公共成员数组              MemberInfo[] Members = t.GetMembers();              //遍历数组,迭代每个成员信息              foreach (MemberInfo NextMember in Members)              {                  Console.WriteLine(NextMember.DeclaringType + "," + NextMember.MemberType + "," + NextMember.Name);              }          }      }  }

实例转载http://blog.csdn.net/lulu_jiang/article/details/5683879

遍历获取一个类的所有属性名
 private void button1_Click(object sender, EventArgs e)  2        { 3            Type t = typeof(System.Drawing.Color); 4            string className = t.Name; 5            MessageBox.Show(className); 6 7            //获取所有方法 8            System.Reflection.MethodInfo[] methods = t.GetMethods(); 9            this.textBox1.Text = "";10            foreach (System.Reflection.MethodInfo method in methods)11            {12                this.textBox1.Text += method.Name + System.Environment.NewLine;13            }1415            //获取所有成员16            System.Reflection.MemberInfo[] members = t.GetMembers();1718            //获取所有属性19            System.Reflection.PropertyInfo[] properties = t.GetProperties();20            foreach (System.Reflection.PropertyInfo property in properties)21            {22                this.lstColors.Items.Add(property.Name);23            }24        }2526        private void lstColors_SelectedIndexChanged(object sender, EventArgs e)27        {28           this.pictureBox1.BackColor=  System.Drawing.Color.FromName(((ListBox)sender).Text);29        }

  方法,构造函数等一些类型信息的获取可以参考http://www.VEVb.com/knowledgesea/archive/2013/03/02/2935920.html这个博客对.net反射讲解很清楚,实例也比较容易理解。


上一篇:C# Redis

下一篇:C#接口作用的深入理解

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表