前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >怎么使用Type类?

怎么使用Type类?

作者头像
静心物语313
发布2020-03-24 14:49:57
9840
发布2020-03-24 14:49:57
举报

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,判断是否为抽象的,含接口

代码语言:javascript
复制
代码解释:
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子类的代码:

代码语言:javascript
复制
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);

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Type类的使用
  • 动态创建对象
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档