目录
涉及知识点: 反射遍历并使用类
一、前期准备
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}");