C# - 反射核心Type类常用方法 137

C# - 反射核心Type类常用方法 137

编码文章call10242025-03-28 11:16:2523A+A-

#头条创作挑战赛#

反射中Assembly类基本只在加载程序集中应用一次,而获取程序集中的类型,方法,属性等等都需要通过Type类的方法进行操作

1 获取Type的类型

假设有一个Person类,可通过以下方式获取其type类型

class Program
{
    static void Main(string[] args)
    {
        //获取Person类型Type的方式
        //1.通过对象调用GetType()方法
        Person p = new Person();
        Type type = p.GetType();
        //2.通过typeof关键字
        Type type1 = typeof(Person);
        //3.通过程序集对象的GetType()方法
        Assembly asm = Assembly.LoadFile(@"d:\ClsLib.dll");
        //方法参数: 命名空间.类型名
        Type typs = asm.GetType("ClsLib.Person");
    }
}
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public void Say()
    {
        Console.WriteLine("获取type类型");
    }
}

将要用于反射的类库代码

namespace ClsLib
{
    public class Person
    {
        private string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
        public int Age { get; set; }
        public void Say()
        {
            Console.WriteLine("获取type类型");
        }
        private void SayHi()
        {
            Console.WriteLine("通过反射调用了Person类私有方法");
        }
    }
    //接口
    public interface IFlyable
    {
        void Fly();
    }
    //继承父类与实现接口
    public class Chinese : Person, IFlyable
    {
        public string CID { get; set; }

        #region IFlyable 成员

        public void Fly()
        {
            Console.WriteLine("翼装飞行");
        }

        #endregion
    }
    //抽象类
    public abstract class MyAbsClass
    {
        //抽象方法
        public abstract void SayHello();
    }
    //静态类
    public static class MyStaticClass
    {    }
}

2 通过Type类的方法验证是否存在继承关系,是否为指定对象,是否为指定类型的子类,是否为抽象类;通过反射调用私有方法

class Program
{
    static void Main(string[] args)
    {
        //1.动态加载程序集
        Assembly asm = Assembly.LoadFile(@"d:\ClsLib.dll");

        //2.1获取Chinese类型的Type
        Type typChinese = asm.GetType("ClsLib.Chinese");

        //2.2获取Person类型的Type
        Type typPerson = asm.GetType("ClsLib.Person");

        //2.3获取接口类型的Type
        Type typFly = asm.GetType("ClsLib.IFlyable");

        //2.4获取抽象类MyAbsClass的Type
        Type typMyAbsClass = asm.GetType("ClsLib.MyAbsClass");

        //2.5获取静态类MyStaticClass的Type
        Type typMyStaticClass = asm.GetType("ClsLib.MyStaticClass");

        #region 验证是否存在继承关系
        Console.WriteLine("验证是否存在继承关系");
        //验证是不是可以把typChinese类型的对象赋值给typPerson类型。
        bool b1 = typPerson.IsAssignableFrom(typChinese);
        //true,因为Chinese继承了Person
        Console.WriteLine(b1);

        //判断是否可以将typChinese的对象赋值给typFly类型
        bool b2 = typFly.IsAssignableFrom(typChinese);
        Console.WriteLine(b2);
        #endregion

        #region IsInstanceOfType 验证是否为指定对象类型
        Console.WriteLine("验证是否为指定对象类型");
        //创建了一个typChinese类型的对象obj
        object obj = Activator.CreateInstance(typChinese);

        //验证obj是不是typChinese类型的对象
        bool b3 = typChinese.IsInstanceOfType(obj);
        Console.WriteLine(b3);//true

        //验证obj是不是typPerson类型的对象
        bool b4 = typPerson.IsInstanceOfType(obj);
        Console.WriteLine(b4);//true
        #endregion

        #region IsSubclassOf 验证是否为指定类型的子类
        Console.WriteLine("验证是否为指定类型的子类");
        //验证typChinese是否是typPerson的子类
        bool b5 = typChinese.IsSubclassOf(typPerson);
        Console.WriteLine(b4);

        //判断typChinese是否是typFly的子类
        //IsSubclassOf不考虑接口(存在是否实现)
        //只考虑父子类关系
        bool b6 = typChinese.IsSubclassOf(typFly);
        Console.WriteLine(b6);
        #endregion

        #region IsAbstract,判断某个类型是否是一个抽象的
        Console.WriteLine("判断某个类型是否是一个抽象的");
        Console.WriteLine(typChinese.IsAbstract);//false
        Console.WriteLine(typPerson.IsAbstract);//false

        //接口、抽象类、静态类都不能被实例化
        //所以这里都认为是 抽象的   都是true
        Console.WriteLine(typFly.IsAbstract);
        Console.WriteLine(typMyAbsClass.IsAbstract);
        Console.WriteLine(typMyStaticClass.IsAbstract);
        #endregion

        #region 通过反射调用类的私有成员
        Console.WriteLine("调用私有方法");
        Type tpPerson = asm.GetType("ClsLib.Person");
        //                                                   包含                非公有                                 实例成员
        MethodInfo mi = tpPerson.GetMethod("SayHi", BindingFlags.NonPublic | BindingFlags.Instance);
        object ob = Activator.CreateInstance(tpPerson);
        //调用私有方法
        mi.Invoke(ob, null);
        #endregion
        Console.ReadKey();
    }
点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4