C# 关于反射的简单示例

写在前面

在日常开发中,我们经常使用反射来动态获取关于类的信息,或者是动态给类实例成员赋值;反射提供了封装程序集、模块和类型的对象(Type 类型)。可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了属性,可以利用反射对它们进行访问。

代码实现

cs 复制代码
using System.Reflection;

class ReflectionDemo
{

    static void Main(string[] args)
    {

        Assembly myAssembly = Assembly.Load("ReflectionDemo");

        var types = myAssembly.GetTypes();//获取类型
        foreach (Type type in types)//针对每个类型获取详细信息
        {
            if (type.Name != "MyClass") continue;

            Console.WriteLine($"type name:{type.Name}");
            Console.WriteLine($"is interface:{type.IsInterface}"); 

            //获取类型的结构信息
            var myConstructors = type.GetConstructors();
            Console.WriteLine($"constructor count: {myConstructors.Length}");

            //获取类型的字段信息
            var myFields = type.GetFields();
            Console.WriteLine($"field count: {myFields.Length}");

            //获取方法信息
            var myMethodInfo = type.GetMethods();
            Console.WriteLine($"method count: {myMethodInfo.Length}");

            //获取属性信息
            var myProperties = type.GetProperties();
            Console.WriteLine($"property count: {myProperties.Length}");

            //获取事件信息
            var myEvents = type.GetEvents();
            Console.WriteLine($"event count: {myEvents.Length}");
        }
 
        var myClass = myAssembly.CreateInstance("MyClass", true, BindingFlags.Default, null, new object[] { "test" }, null, null);
        if (myClass != null)
        {
            var myClassType = myClass.GetType();
            var ageProp = myClassType.GetProperty("Age");
            ageProp.SetValue(myClass, 100);
            Console.WriteLine($"Age is:{((MyClass)myClass).Age }");
        }

        Console.ReadLine();
    }

}

public class MyClass
{

    public int Type = 0;

    public MyClass()
    {

    }

    public MyClass(string name)
    {
        Name = name;
    }

    public delegate void HandleEvent(string eventName);

    public event HandleEvent MyEvent;

    public int Id { get; set; }

    public string Name { get; set; }

    public int Age { get; set; }

    public int GetAge()
    {
        return Age;
    }

    public string GetFullName()
    {
        return $"MyClass.{Name}";
    }


}

调用示例

相关推荐
mldong2 小时前
C# 开发者也有自己的轻量工作流引擎了:NuGet 装包,5 分钟跑通一条审批流
后端·c#·.net
kruptos3 小时前
分布式系统怎么“选主“?Raft 共识一次讲清
开发语言·分布式·php·共识算法
吴声子夜歌3 小时前
ApacheCommons——commons-cli(命令行参数解析)
java·开发语言·apache
benchmark_cc4 小时前
REST API 和 Python SDK 应该怎么选?量化交易数据接口选型实战
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
王的宝库4 小时前
Go 项目结构:从单文件到标准工程布局
开发语言·后端·golang
Tairitsu_H4 小时前
[C++] 深入理解红黑树:封装set与map
开发语言·c++·set·map·红黑树·模拟实现
泡海椒5 小时前
JQuick-Curl 性能分析:并发场景下的性能表现与调优,第三方接口调用不只要快写也要稳跑
java·开发语言·okhttp
小智老师PMP5 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
samble6 小时前
从零搭建工业控制系统(二十二):线程安全与并发控制
c#·wpf·并发·mvvm·线程安全·工业控制
江畔柳前堤6 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native