• 反射


    反射:运行时发现类型的信息,创建类型的实例以及访问类型的成员。

    1、通过反射可以读取物理文件程序集的代码内容。

    2、可以通过反射,根据类名(字符串)动态的创建类的对象。

    3、可以在程序运行时,动态地获得对象里的信息。(方法、属性、字段、索引)

    4、可以根据成员名称(字符串)来调用执行对象里对应的成员。

    Assembly类是对Assembly的描述

    AppDomain.CurrentDomain.GetAssemblies()//获得正在运行的所有程序集。

    Assembly.LoadFile()动态从文件加载Assembly,不需要再编译时引用。

    //加载指定路径dll

    Assembly ase = Assembly.LoadFrom(@"Model.dll");

    public class Person
    {
    private string strName = "aa";
    private int age = 18;
    public int Age
    {get{return age;}set{age = value;}}

    public string StrName
    {
    get
    {return strName;}

    set
    {strName = value;}
    }

    public string SayHi(string str)
    {return strName + "大家好!"+str;}

    }

    Type用来保存某个类里成员信息的集合。

    获取Type两种方式:

    Type t1=typeof(类型);

    Type t2=对象.GetType();

    Type type=typeof(Person);

    FieldInfo[] fields=type.GetFields();//获得类里所有的字段信息(字段名、字段类型,没有字段的值)
    MethodInfo[] methods=type.GetMethods();//获得类里所有的方法信息
    PropertyInfo[] pros=type.GetProperties();//获得类里所有的属性信息
    type.GetConstructor();//获得构造函数

    type.GetEvents();//获得事件

    public class testFather
    {
    public string aa { get; set; }
    }

    interface IRun
    {

    }

    public class testSun1
    {
    }

    public class testSun:testFather,IRun
    {
    public string name { get; set; }

    public string Shout()
    {
    return "shout";
    }

    public string Shout(string nameObj)
    {
    return name + " 参数:" + nameObj;
    }

    public string Shout(string nameObj,int intObj)
    {
    return string.Format("{0} 参数1:{1} 参数2:{2}", name, nameObj, intObj);
    }

    private string priFunc()
    {
    return "私有方法";
    }

    }

    //IsAssignableFrom 判断testSun是否继承于testFather(类和接口都可以),实质是判断testSun是否可强转成testFather

    MessageBox.Show( typeof(testFather).IsAssignableFrom(typeof(testSun)).ToString() );

    Type typeFather= typeof(testFather);
    Type typeSun = typeof(testSun);
    Type typeSun1 = typeof(testSun1);
    Type typeInter = typeof(testInterfance);
    Type typeIRun = typeof(IRun);

    testFather father = new testFather();
    testSun sun = new testSun();
    testSun1 sun1 = new testSun1();

    string isAssign = typeFather.IsAssignableFrom(typeSun).ToString();
    string isAssignFromInterfance = typeIRun.IsAssignableFrom(typeSun).ToString();
    string isAssignFromInterfance1 = typeIRun.IsAssignableFrom(typeSun1).ToString();
    MessageBox.Show(string.Format("{0},{1},{2}",isAssign,isAssignFromInterfance,isAssignFromInterfance1 ) );

    //IsInstanceOfType 判断某个对象是否是某个type所对应的实例

    bool isInstance = typeSun.IsInstanceOfType(sun);
    bool isInstance1 = typeSun.IsInstanceOfType(father);
    MessageBox.Show(string.Format("{0},{1}", isInstance, isInstance1));

    //IsSubclassOf 判断某个类是否是另一个类的子类,只能用来判断类的继承,不能用来判断接口。

    bool isSubF= typeSun.IsSubclassOf(typeFather);
    bool isSubS = typeSun1.IsSubclassOf(typeFather);
    bool isS = typeInter.IsSubclassOf(typeIRun);
    MessageBox.Show(string.Format("{0},{1},{2}", isSubF, isSubS,isS));

    //获取类里的方法

    MethodInfo method = typeSun.GetMethod("Shout");

    //执行方法
    MessageBox.Show(method.Invoke(sun, null).ToString() ); 

    //通过方法参数的类型数组来区分重载

    //获得不带参数的Shout方法
    MethodInfo method1 = typeSun.GetMethod("Shout",new Type[0]);
    MessageBox.Show(method1.Invoke(sun, null).ToString()); 

    //获得带一个参数的Shout方法
    MethodInfo methodWidthPara = typeSun.GetMethod("Shout", new Type[] { typeof(string) } );
    string str=methodWidthPara.Invoke(sun,new object[] { "123"}).ToString() ;
    MessageBox.Show(str);

    //调用私有方法
    MethodInfo methodPrivate = typeSun.GetMethod("priFunc",BindingFlags.NonPublic|BindingFlags.Instance);
    MessageBox.Show(methodPrivate.Invoke(sun,null).ToString() );

    //获取自定义标签

    [AttributeUsage(AttributeTargets.Property)]
    public class testAttribute : Attribute
    {
    public bool isDisplay;
    }

    public class Person

    {

    [testAttribute(isDisplay =true)]

    public string Name{get;set;}

    [testAttribute(isDisplay =false)]

    public int Age{get;set;}

    public string Test{get;set;}

    }

    //使用

    Person per=new Person();

    ProertyInfo[] infos=typeof(Person).GetProperties();

    foreach(PropertyInfo item in infos)

    {

    //IsDefined 是否为指定类型的自定义特性随即应用于指定的成员

    if(item.IsDefined(typeof(testAttribute)))

    {

    //得到客户端标签isDisplay的值

    if(((testAttribute)item.GetCustomAttribute(typeof(testAttribute))).isDisplay)

    {

    MessageBox.Show(item.GetValue(per).ToString());

    }

    }

    }

    //获取枚举描述

    public enum testEnum
    {
    [Description("nromal描述")]
    normal=0,
    [Description("cal描述")]
    cal =1,
    [Description("rate描述")]
    rate =2
    }

    //使用

    Array array=typeof(testEnum).GetEnumValues();

    foreach(var item in array)

    {

    FieldInfo field = Enum.Parse(typeof(testEnum),item.ToString()).GetType().GetField(item.ToString());

    string des=((DescriptionAttribute)field.GetCustomAttribute(typeof(DescriptionAttribute))).Description;

    MessageBox.Show(des);

    }

  • 相关阅读:
    CentOS7.4 chrony时间同步服务器部署(替代NTPD)
    Zabbix Agent for Windows部署(五)
    Zabbix3.4.5部署安装(二)
    Zabbix概术及基础介绍(一)
    修改zabbix为中文,并解决乱码问题(三)
    ZABBIX 3.4 监控Nginx 状态(七)
    PXE+Kickstart 全自动安装部署CentOS7.4
    Zabbix Agent for Linux部署(四)
    不能在 DropDownList 中选择多个项 原因分析及解决方法
    IE浏览器下的CSS问题
  • 原文地址:https://www.cnblogs.com/buzhidaojiaoshenme/p/6821290.html
Copyright © 2020-2023  润新知