怎么使用Type类?

 

Type类的使用

1通过获得TypeType t = typeof(Person)(就是拿到这个类的名字)

2通过对象获得类的TypeType t = p.GetType() 

Person p=new Person();

3c:\abc.dll

    Assembly asm=Assembly.LoadFile(c:\abc.dll);

4调用AssemblyGetExportedTypes方法可以得到Assembly中定义的所有的public类型。

5调用AssemblyGetTypes()方法可以得到Assembly中定义的所有的类型。

6调用AssemblyGetType(name)方法可以得到Assembly中定义的全名为name的类型信息。

插件:扩展主程序功能的dll.

动态创建对象

1Activator.CreateInstance(Type t)会动态调用类的无参构造函数创建一个对象,返回值就是创建的对象,如果类没有无参构造函数就会报错。

2GetConstructor(参数列表);//这个是找到带参数的构造函数。

3Type类的方法:在编写调用插件的程序时,需要做一系列验证。

4bool IsAssignableFrom(Type c):(直译:是否可以从c赋值)判断当前的类型的变量是不是可以接受c类型变量的赋值。

5typeof(IPlugin).IsAssignableFrom(t)

bool IsInstanceOfType(object o):判断对象o是否是当前类的实例(当前类可以是o的类、父类、接口)

6、bool IsSubclassOf(Type c)判断当前类是否是类c的子类。类的事,没有接口的事。

7IsAbstract,判断是否为抽象的,含接口

代码解释:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Reflection;//引入

 

namespace Tyep_三个重要方法

{

    class Program

    {

        static void Main(string[] args)

        {

            ///路径这里是不能有空格的,否则会报错!!!!!

            Assembly ass = Assembly.LoadFile(@"C:\Users\Administrator\Desktop\ASPNET\反射\MyClass\bin\Debug\MyClass.dll");

            //Type[] tp = ass.GetTypes();//或取这个程序集中所有的可以访问的类、接口

            //Type[] tp = ass.GetExportedTypes();//或取这个类中所有的可以访问的类、接口

 

            //下边来拿 这个程序集指定的“类”、“接口”中的方法和属性

            Type tpPeroson = ass.GetType("MyClass.Person");

            Type tpStudnet = ass.GetType("MyClass.Student");

 

            #region //tpStudnet能不能赋值赋值给tpPeroson。。当然可以,因为:Student:Person;;

            //bool result = tpPeroson.IsAssignableFrom(tpStudnet);

            //Console.WriteLine(result + "子类是可以赋值给父类的"); 

            #endregion

 

 

            #region tStudent是否是tperson的一个实例。。这个当然是,因为:Student:Person;;Student首先要转化为object类型

            //object obj = Activator.CreateInstance(tpStudnet);

            //bool result = tpPeroson.IsInstanceOfType(obj);//发现这里是用的object类型的。所以要将tpStudent 转化为object类型

            //Console.WriteLine(result);

            

            #endregion

 

            #region 是否是子类

            //bool result = tpStudnet.IsSubclassOf(tpPeroson);

            //Console.WriteLine(result); 

            #endregion

 

            #region 判断是否是抽象的类,含接口

            Type tpAnimal = ass.GetType("MyClass.Animal");

            bool result = tpAnimal.IsAbstract;

            Console.WriteLine(result); 

            #endregion

 

 

 

            #region 获取指定类中的所有方法

            //Console.WriteLine(ap.Name);//在这里就是拿到了这个指定类的名字了

            //MethodInfo[] methes = ap.GetMethods();

            //foreach (MethodInfo item in methes)

            //{

            //    Console.WriteLine("指定类中方法" + item.Name);//在这里就是拿到了这个指定类的所有方法了

            //} 

            #endregion

 

            Console.ReadKey();

        }

    }

}

 

MyClass子类的代码:

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace MyClass

{

    public class Student:Person

    {

 

       

    }

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace MyClass

{

   public  interface IFly

    {

    }

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace MyClass

{

    public abstract class Animal

    {

    }

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace MyClass

{

    public class Person

    {

        private string _Name;  //Ctrl+ R+封装字段

 

        public string Name

        {

            get { return _Name; }

            set { _Name = value; }

        }

        private int _Age;

 

        public int Age

        {

            get { return _Age; }

            set { _Age = value; }

        }

        public void DoSth()

        {

        }

    }

}

 

 

 

附录1

 

 Type type=typeof(Person);//没对象

            Type ty = per.GetType();//有对象

 //获取所有的字段属性

// FieldInfo[]fileinfo= ty.GetFields();

            //获取所有的公共属性

            PropertyInfo[]propertyin= ty.GetProperties();

 //获取所有的方法

            MethodInfo[]methinfo= ty.GetMethods();

            //获取所有的事件

            EventInfo[]eventinfo= ty.GetEvents();

 //获取所有的成员

            MemberInfo[]member= type.GetMembers();

===================================================================================

 Assembly asm= Assembly.LoadFile(@"E:\讲课视频代码集合\备课资料演示\基础加强1006\01练习题\MyClassLibrary\bin\Debug\MyClassLibrary.dll");

            Type[]types1= asm.GetExportedTypes();//获取所有公共的

            Type[] types2 = asm.GetTypes();//获得所有的

            foreach (Type item in types1)

            {

                Console.WriteLine(item.Name);

            }

            Console.ReadKey();

 

============================================================

foreach (MethodInfo item in methinfo)

            {

                //没有获取私有方法

                Console.WriteLine(item.Name);

            }

============================

//Type t = typeof(Person);

            ////类的全名称

            //Console.WriteLine(t.FullName);

            ////类所在的程序集的全名称

            //Console.WriteLine(t.Assembly.FullName);

 

 

 

////获取程序集中所有公共的类型

            //Type[] types = ass.GetExportedTypes();

            //foreach (Type type in types)

            //{

            //    Console.WriteLine(type.Name);

            //}

            ////获取程序集中所有的类型

            //Type[] tys =  ass.GetTypes();

            //foreach (Type item in tys)

            //{

            //    Console.WriteLine(item.Name);

            //}

            ////根据名称获得一个类型

            //Type tPerson = ass.GetType("抽象类.Circle");

            //Console.WriteLine(tPerson.Name);

=======================================

 Type ty= asm.GetType("MyClassLibrary.Person");

 

 

附录2

 

 

Assembly ass=   Assembly.LoadFile(@"MyClass\bin\Debug\MyClass.dll");

============================================

 //获取公用的类

          Type[]types=  ass.GetExportedTypes();

          foreach (Type item in types)

          {

              Console.WriteLine(item.Name);

          }

================================

 //获取所有类型

           //Type []types= ass.GetTypes();

           //foreach (Type item in types)

           //{

           //    Console.WriteLine(item.Name);

           //}

=================================================

 //获取指定类型的Person

           Type typePerson= ass.GetType("MyClass.Person");

           Console.WriteLine(typePerson.Name);

============================================================================第一个方法验证

 //判断chinese类型是否可以赋值给person

           Console.WriteLine(typePerson.IsAssignableFrom(typeChinese));

 Console.WriteLine(tyPer.IsAssignableFrom(tyChinese));//括号里的对象能不能赋值给tyPer

=============================================================

 Type typePerson = ass.GetType("MyClass.Person");

           Type typeChinese = ass.GetType("MyClass.Chinese");

           Object chinese= Activator.CreateInstance(typeChinese);

           Object person= Activator.CreateInstance(typePerson);

            //判断chinese这种类型是不是chinese这种类型

           Console.WriteLine(typeChinese.IsInstanceOfType(chinese));

=======================================================================================第二个方法验证

 Type tyPer = asm.GetType("MyClassLibrary.Person");

            Type tyChinese = asm.GetType("MyClassLibrary.Chinese");

            object objPer = Activator.CreateInstance(tyPer);

            object objChinese = Activator.CreateInstance(tyChinese);

            Console.WriteLine(tyPer.IsInstanceOfType(objChinese));

 

========================================================

 Type typePerson = ass.GetType("MyClass.Person");

           Type typeChinese = ass.GetType("MyClass.Chinese");

            //判断是不是子类关系,接口没有子类一说,

           Console.WriteLine(typePerson.IsSubclassOf(typeChinese));

 Console.WriteLine(tyChinese.IsSubclassOf(tyPer));判断chinese是不是Person的子类

==============================================

 //判断是不是抽象类含接口,不能实例化的,静态的

           Console.WriteLine(typePerson.IsAbstract);

 Console.WriteLine(tyPer.IsAbstract);

            Console.WriteLine(tyIfly.IsAbstract);

=========================================是不是抽象的

==============================================

 

 

posted @ 2015-05-29 14:41  t800  阅读(321)  评论(0编辑  收藏  举报