• c# 反射


    C#中的反射是一种强大的机制,允许你在运行时动态地获取和操作程序集、类型、对象和成员的信息。反射使得你可以在不知道编译时类型的情况下,通过程序代码来获取、创建和操作对象。

    以下是使用C#反射的一些常见用途:

    1. **获取程序集信息:** 你可以使用反射来加载程序集,并获取程序集的元数据信息,如程序集名称、版本、作者等。

    2. **获取类型信息:** 反射允许你获取类型的信息,包括名称、方法、字段、属性、事件等。你可以使用`Type`类来表示类型信息。

    3. **创建对象实例:** 通过反射,你可以根据类型信息动态创建对象实例,而不必在编译时知道类型。

    4. **调用方法和属性:** 反射使你能够在运行时调用对象的方法、访问属性、添加或删除事件处理程序等。

    5. **操作字段:** 你可以使用反射来读取和设置对象的字段值,包括私有字段。

    6. **检查特性:** 你可以检查类型、方法、属性等是否具有特定的自定义特性,并在运行时根据这些特性执行不同的逻辑。

    下面是一个简单的示例,演示如何使用反射获取和使用类型信息:

    ```csharp
    using System;
    using System.Reflection;

    class Program
    {
        static void Main()
        {
            // 加载程序集
            Assembly assembly = Assembly.LoadFrom("SampleAssembly.dll");

            // 获取类型信息
            Type type = assembly.GetType("SampleNamespace.SampleClass");

            // 创建对象实例
            object instance = Activator.CreateInstance(type);

            // 调用方法
            MethodInfo method = type.GetMethod("SayHello");
            method.Invoke(instance, null);

            // 获取和设置属性
            PropertyInfo property = type.GetProperty("Name");
            property.SetValue(instance, "John Doe");
            Console.WriteLine("Name: " + property.GetValue(instance));

            // 检查是否具有特性
            if (type.IsDefined(typeof(MyCustomAttribute), inherit: false))
            {
                Console.WriteLine("Type has MyCustomAttribute");
            }
        }
    }

    [MyCustom("Sample")]
    namespace SampleNamespace
    {
        class SampleClass
        {
            public string Name { get; set; }

            public void SayHello()
            {
                Console.WriteLine("Hello, " + Name);
            }
        }

        [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
        sealed class MyCustomAttribute : Attribute
        {
            public MyCustomAttribute(string value)
            {
                Value = value;
            }

            public string Value { get; }
        }
    }
    ```

    在上述示例中,我们加载了一个程序集,获取了类型信息,创建了对象实例,调用了方法,获取和设置了属性,并检查了类型是否具有自定义特性。这只是反射的基本用法,反射的功能非常强大,可以用于许多高级场景。但请注意,反射可能会引入性能开销,因此在使用反射时需要谨慎考虑性能方面的影响。

  • 相关阅读:
    Pandas常用操作命令(五)——数据排序sort_values
    工程地质实习-工程地质 题集
    Redis-核心数据结构
    百万数据直接返回,高性能量化数据库Arctic,基于mongo的列存引擎
    【学习笔记】浅谈高斯整数
    Kubernetes基础服务安装
    网页设计软件Bootstrap Studio6.7.1
    【第一篇】- 深入学习Git 教程
    领域驱动设计:基于DDD的微服务设计实例
    HCIP--IPV6综合实验
  • 原文地址:https://blog.csdn.net/nbspzs/article/details/133240312