• c#反射(Reflection)


    当我们在C#中使用反射时,可以动态地获取和操作程序集、类型和成员。下面是一个简单的C#反射示例,展示了如何使用反射来调用一个类的方法:

    using System;
    using System.Reflection;
    
    public class MyClass
    {
        public void MyMethod()
        {
            Console.WriteLine("Hello from MyMethod!");
        }
    }
    
    class Program
    {
        static void Main()
        {
            // 获取MyClass的类型
            Type myType = typeof(MyClass);
            
            // 创建MyClass的实例
            object myObject = Activator.CreateInstance(myType);
            
            // 获取MyMethod方法的信息
            MethodInfo myMethod = myType.GetMethod("MyMethod");
            
            // 调用MyMethod方法
            myMethod.Invoke(myObject, null);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    在这个示例中,我们首先获取了MyClass的类型,并使用Activator.CreateInstance创建了一个MyClass的实例。然后,我们使用GetMethod方法获取了MyMethod方法的信息,并使用Invoke方法调用了该方法。

    当运行这段代码时,它会输出Hello from MyMethod!。这是因为我们使用反射成功地获取并调用了MyMethod方法。

    请注意,反射是一项强大的技术,但也需要小心使用。它可以在某些情况下带来灵活性和动态性,但同时也会引入性能开销。因此,在使用反射时,应该权衡利弊并仔细考虑是否真正需要使用反射来解决问题。

    一些常用操作

    C#反射是一种强大的技术,可以在运行时动态地获取和操作程序集、类型和成员。下面是一些C#反射的具体用法:
    1.获取类型信息:使用typeof关键字可以获取一个类型的Type对象,该对象包含了有关该类型的信息,如名称、方法、属性等。

    Type myType = typeof(MyClass);
    
    
    • 1
    • 2

    2.创建对象实例:使用Activator.CreateInstance方法可以根据类型创建一个对象的实例。

    object myObject = Activator.CreateInstance(myType);
    
    
    • 1
    • 2

    3.获取成员信息:使用GetField、GetProperty、GetMethod等方法可以获取类型的字段、属性、方法等成员的信息

    FieldInfo myField = myType.GetField("myField");
    PropertyInfo myProperty = myType.GetProperty("myProperty");
    MethodInfo myMethod = myType.GetMethod("myMethod");
    
    
    • 1
    • 2
    • 3
    • 4

    4.调用方法和访问属性:使用Invoke方法可以调用一个方法,使用GetValue和SetValue方法可以获取和设置一个属性的值

    myMethod.Invoke(myObject, null);
    object value = myProperty.GetValue(myObject);
    myProperty.SetValue(myObject, newValue);
    
    
    • 1
    • 2
    • 3
    • 4

    5.枚举类型信息:使用GetEnumValues方法可以获取枚举类型的所有值,使用GetEnumNames方法可以获取枚举类型的所有名称

    Array enumValues = Enum.GetValues(typeof(MyEnum));
    string[] enumNames = Enum.GetNames(typeof(MyEnum));
    
    
    • 1
    • 2
    • 3

    assembly 动态加载

    在C#中,使用反射可以加载、操作和检查程序集。程序集是一个包含代码、资源和元数据的文件,可以是一个可执行文件(如.exe)或一个动态链接库(如.dll)。下面是使用C#反射操作程序集的一些常见用法:

    加载程序集:使用Assembly.Load方法可以加载一个程序集
    1.加载程序集:使用Assembly.Load方法可以加载一个程序集

    Assembly assembly = Assembly.Load("MyAssembly");
    
    
    • 1
    • 2

    2.获取程序集信息:通过Assembly对象,可以获取程序集的信息,如名称、版本、类型等

    string assemblyName = assembly.FullName;
    Version assemblyVersion = assembly.GetName().Version;
    
    
    • 1
    • 2
    • 3

    3.获取类型信息:通过Assembly对象,可以获取程序集中定义的类型

    Type[] types = assembly.GetTypes();
    
    
    • 1
    • 2

    4.创建对象实例:通过Type对象,可以创建程序集中定义类型的对象实例

    Type myType = assembly.GetType("MyNamespace.MyClass");
    object myObject = Activator.CreateInstance(myType);
    
    
    • 1
    • 2
    • 3

    5.调用方法和访问属性:通过Type对象,可以获取程序集中定义类型的方法和属性信息,并进行调用和访问

    MethodInfo myMethod = myType.GetMethod("MyMethod");
    myMethod.Invoke(myObject, null);
    
    PropertyInfo myProperty = myType.GetProperty("MyProperty");
    object value = myProperty.GetValue(myObject);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    这些只是C#反射操作程序集的一些常见用法示例。通过反射,可以在运行时动态加载和操作程序集,以实现更灵活的代码逻辑和功能。但要注意,使用反射可能会带来一些性能开销,并且需要处理异常和安全性等问题

  • 相关阅读:
    5.Servlet
    一个基于轮询的广告系统
    HM-RocketMQ2.2【SpringBoot整合RocketMQ】
    3分钟看懂设计模式02:观察者模式
    HTML_案例1_注册页面
    Dockerfile手册
    [MAUI]实现动态拖拽排序网格
    软件架构设计(八) 基于架构的软件开发方法
    图像处理Sobel 算子
    BEVFormer治好了我的精神内耗
  • 原文地址:https://blog.csdn.net/qq_41942413/article/details/132700460