C#反射应用

本文详细介绍了C#中的反射概念,包括如何加载dll、遍历类、字段、属性和方法,并提供了实例演示了字段、属性和各种方法的使用,包括构造方法、重构方法、泛型方法和普通方法的调用。
摘要由CSDN通过智能技术生成

目录

一、前期准备

二、反射概念

三、反射加载dll方式 

四、反射遍历类

1、遍历dll中的类

2、遍历类中的各种字段

3、遍历类中的各种属性

4、遍历类中的各种方法

五、类中值的应用

1、字段的使用

2、属性的使用

3、方法的使用

1、构造方法 

2、重构方法

3、泛型方法

4、普通方法


涉及知识点: 反射遍历并使用类

一、前期准备

using System;
using System.Reflection;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Runtime.CompilerServices;

二、反射概念

        通过工程文件中的dll文件,获取并使用内部的类中所有内容

三、反射加载dll方式 

加载一:使用dll文件名

//加载一:使用dll文件名 -- 当前目录 -- 引用->添加引用
  Assembly assembly = Assembly.Load("反射");

加载二:使用完整路径名 

//加载二:使用完整路径名
Assembly assembly = Assembly.LoadFile(@"C:\\Users\\Rush\\Desktop\\C#\\反射\\bin\\Debug\\netcoreapp3.1\\反射.dll");

加载三:使用完全限定名 --(推荐)

//加载三:使用完全限定名 -- 当前目录 -- 引用->添加引用 --(推荐)
Assembly assembly = Assembly.LoadFrom("反射.dll");

加载四:使用完整路径名

 //加载四:使用完整路径名
Assembly assembly = Assembly.LoadFrom(@"C:\\Users\\Rush\\Desktop\\C#\\反射\\bin\\Debug\\netcoreapp3.1\\反射.dll");

四、反射遍历类

1、遍历dll中的类

前期准备:

namespace 反射
{
 internal class Program
 {
   static void Main(string[] args)
    {
    }
 }
 //普通类
 class Student{}
 //泛型类
 class Children<T, K, S>{}
 //接口
 interface ISchool { }
 //秘密类
 sealed class University { }
 //静态类
 static class Company { }
}

 获取dll中类(包括接口):

 GetType("XXX") -- 获取指定类名

 GetTypes()   -- 获取所有类

    internal class Program
    {
        static void Main(string[] args)
        {
            //加载dll
            Assembly assembly = Assembly.LoadFrom("反射.dll");
            //遍历dll 所有类(包括接口)
            foreach (Type type in assembly.GetTypes())
            {
                Console.WriteLine(type.Name);
            }
        }
    }

结果显示: 

2、遍历类中的各种字段

前期准备:

    class Student
    {
        //↓↓↓↓↓↓↓↓字段↓↓↓↓↓↓↓↓
        //内部字段
        internal string name;
        //受保护字段
        protected float grade;
        //静态字段
        public static int age;
        //公开字段
        public int id;
        //私有字段
        private string sex;
    }

 获取类中的各类型字段:

type.GetField("XXX") ; -- 获取指定字段

type.GetFields(); -- 获取所有字段

internal class Program
{
    static void Main(string[] args)
    {
        //加载dll
        Assembly assembly = Assembly.LoadFrom("反射.dll");
        //遍历dll 所有类(包括接口)
        foreach (Type type in assembly.GetTypes())
        {
            //显示类名
            Console.WriteLine($"类名:{type.Name}");
            //遍历所有公开字段
            foreach (FieldInfo field in type.GetFields())
            {
                Console.WriteLine($"字段类型:{field.FieldType.Name} " +
                                  $"字段名:{field.Name}");
            }
            //遍历所有私有字段
            foreach (FieldInfo privateField in type.GetFields(BindingFlags.Instance
                                                            | BindingFlags.NonPublic))
            {
                Console.WriteLine($"私有 -- " +
                                  $"字段类型{privateField.FieldType.Name} " +
                                  $"字段名:{privateField.Name}");
            }
        }
    }
}

结果显示: 

3、遍历类中的各种属性

前期准备:

    class Student
    {
        //↓↓↓↓↓↓↓↓属性↓↓↓↓↓↓↓↓
        //内部属性
        internal string Sex { get; set; }
        //受保护属性
        protected int Id { get; set; }
        //公共属性
        public int Age { get; set; }
        //静态属性
        public static float Grade { get; set; }
        //私有属性
        private string Hobby { get; set; }
    }

 获取dll中类(包括接口):

internal class Program
{
    static void Main(string[] args)
    {
        //加载dll
        Assembly assembly = Assembly.LoadFrom("反射.dll");
        //遍历dll 所有类(包括接口)
        foreach (Type type in assembly.GetTypes())
        {
            //显示类名
            Console.WriteLine($"类名:{type.Name}");
            //遍历所有公开属性
            foreach (PropertyInfo property in type.GetProperties())
            {
                Console.WriteLine($"属性类型:{property.PropertyType.Name} " +
                                  $"属性名:{property.Name}");
            }
            //遍历所有私有属性
            foreach (PropertyInfo privateField in type.GetProperties(
                               BindingFlags.Instance | BindingFlags.NonPublic))
            {
                Console.WriteLine($"私有 -- " +
                                  $"属性类型{privateField.PropertyType.Name} " +
                                  $"属性名:{privateField.Name}");
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值