怎么使用Type类?
Type类的使用
1、通过类获得Type:Type t = typeof(Person)(就是拿到这个类的名字)
2、通过对象获得类的Type:Type t = p.GetType()
Person p=new Person();
3、“c:\abc.dll”
Assembly asm=Assembly.LoadFile(“c:\abc.dll”);
4、调用Assembly的GetExportedTypes方法可以得到Assembly中定义的所有的public类型。
5、调用Assembly的GetTypes()方法可以得到Assembly中定义的所有的类型。
6、调用Assembly的GetType(name)方法可以得到Assembly中定义的全名为name的类型信息。
插件:扩展主程序功能的dll.
动态创建对象
1、Activator.CreateInstance(Type t)会动态调用类的无参构造函数创建一个对象,返回值就是创建的对象,如果类没有无参构造函数就会报错。
2、GetConstructor(参数列表);//这个是找到带参数的构造函数。
3、Type类的方法:在编写调用插件的程序时,需要做一系列验证。
4、bool IsAssignableFrom(Type c):(直译:是否可以从c赋值)判断当前的类型的变量是不是可以接受c类型变量的赋值。
5、typeof(IPlugin).IsAssignableFrom(t)
bool IsInstanceOfType(object o):判断对象o是否是当前类的实例(当前类可以是o的类、父类、接口)
6、bool IsSubclassOf(Type c):判断当前类是否是类c的子类。类的事,没有接口的事。
7、IsAbstract,判断是否为抽象的,含接口
代码解释: 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);
=========================================是不是抽象的
==============================================