反射

反射

定义一个类,并且生成dll

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ClassLibrary1
{
    public class Class1
    {
        private int _age;

        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }

        private string _name;

        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        public void SayHi()
        {
            Console.WriteLine("大家好1!");
        }

        public void AAA()
        {
            MyClass mc = new MyClass();
            mc.BBB();
        }
    }

    public interface IFlyable
    {
        void Fly();
    }

    public delegate void MyDelegate();

    public enum Good
    {
        高,
        富,
        帅
    }

    internal class MyClass
    {
        internal void BBB()
        {
            Console.WriteLine("能看到吗》");
        }
    }

    public class Person
    {
        public string Name
        {
            get;
            set;
        }
        public int Age
        {
            get;
            set;
        }
        public string Email
        {
            get;
            set;
        }

    }

    public class Chinese : Person, IZiWoXiuFu
    {
        //户口
        public string HuKouSuoZaiDi
        {
            get;
            set;
        }

        #region IZiWoXiuFu 成员

        public void XiuFu()
        {
            Console.WriteLine("调用了XiuFu方法。");
        }

        #endregion
    }

    public interface IZiWoXiuFu
    {
        void XiuFu();
    }

    public abstract class MyAbsClass
    {
        public abstract void SayHello();
    }

    public static class MyStaticClass
    {
    }
}

反射调用dll里面的方法

  //1加载一个程序集
  string path =@"C:\Users\zhouyong\Desktop\反射\反射\ClassLibrary1.dll";
    Assembly asm = Assembly.LoadFile(path);
            //2.获取Person类型
            Type type = asm.GetType("ClassLibrary1.Class1");
             //获得个方法
             MethodInfo minfo = type.GetMethod("SayHi");
             Console.WriteLine(minfo.Name);
            //创建一个type类型的对象obj
             object obj = Activator.CreateInstance(type);
             //调用方法
             minfo.Invoke(obj, null);

常用的一些反射方法练习

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace Type的一些应用
{
    class Program
    {
        static void Main(string[] args)
        {
            string path = @"C:\Users\zhouyong\Desktop\日常软件\我的资料\programme\practice\反射\反射\ClassLibrary1.dll";
            Assembly asm = Assembly.LoadFile(path);
            //获取chinese类型的Type
             Type chinese= asm.GetType("ClassLibrary1.Chinese");
            //获取Person类型的Type
            Type Person= asm.GetType("ClassLibrary1.Person");
            //获取接口类型的Type
            Type IZiWoXiuFu=asm.GetType("ClassLibrary1.IZiWoXiuFu");
            //获取抽象类的Type
            Type MyAbsClass =asm.GetType("ClassLibrary1.MyAbsClass");
            //获取静态类MyStaticClass的Type
             Type MyStaticClass=  asm.GetType("ClassLibrary1.MyStaticClass");
            #region IsAssiginableFrom
             //3.验证一下Person类型是不是Chinese类型的父类。
            //验证是不是可以把typChinese类型的对象赋值给typPerson类型。
            bool b= Person.IsAssignableFrom(chinese);//ture
            //判断是否可以将chinese=的对象赋值给IZiWoXiuFu接口类型
            bool z = IZiWoXiuFu.IsAssignableFrom(chinese);//ture
             Console.WriteLine(z);
            #endregion
             #region IsInstanceOfType
                   ////创建了一个Chinese类型的对象obj
            object obj= Activator.CreateInstance(chinese);
            MethodInfo xiufu =chinese.GetMethod("XiuFu");
            //调用方法
            xiufu.Invoke(obj, null);
            //验证obj是不是Chinese类型的对象
            bool a = chinese.IsInstanceOfType(obj);//ture
            Console.WriteLine(a);
            bool a1 = Person.IsInstanceOfType(obj);//ture
            Console.WriteLine(a1);
             #endregion
            #region IsSubclassOf
            ////验证Chinese是否是Person的子类
             bool a3 =  chinese.IsSubclassOf(Person);//true
             //IsSubclassOf不考虑接口,只考虑父子类关系。
             bool a4=chinese.IsSubclassOf(IZiWoXiuFu);//false
             Console.WriteLine(a3);
             Console.WriteLine(a4);
            #endregion
             #region IsAbstract,判断某个类型是否是一个抽象的。
             Console.WriteLine(MyAbsClass.IsAbstract); //true
             Console.WriteLine(MyStaticClass.IsAbstract);
            //接口、抽象类、静态类都不能被实例化,所以这里都认为是“抽象的”
             #endregion
            Console.ReadKey();

        }
    }
}


转载请注明: Zhou•Yong 反射

目录