C# 反射

有关元数据的解释:

https://www.cnblogs.com/DswCnblog/p/5344119.html

有关程序及其类型的数据被称为元数据(metadata),它们保存在程序的程序集中

使用元数据,在运动时动态调用一个类型的成员,而不是执行编译时绑定

程序在运行时,可以查看其它程序集或本身的元数据,一个运行的程序查看本身的元数据或其它的元数据的行为叫做反射

要使用反射,我们必须使用System.Reflection命名空间

Type类

这类型是抽象类,因此它不能有实例,而是在运行时,CLR创建从Type派生的类的实例,Type包含了类型信息。当我们要访问这些实例时,CLR不会返回派生类的引用而是Type基类的引用

需要了解的Type重要事项是

对于程序中用到的每一个类型,CLR都会创建一个包含这个类型信息的Type类型对象

程序中用到的每一个类型都会关联到独立的Type类的对象

不管创建的类型由多少个实例,只有一个Type对象会关联到所有这些实例

还有类型是public的吗 Ispublic

类型的基类型是什么 BaseType

支持任何接口吗?GetInterfaces

都有什么特效在修饰类型Type.GetCustomAttributes

获取object对象

object类型包含了一个GetType的方法,它返回对实例Type对象的引用。由于每一个类型最终都是从object继承的,所有我们可以在任何类型对象上使用GetType方法来获取它的Type对象

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
namespace ConsoleApp2
{
    class BaseClass
    {
        public int BaseField = 0;
    }
    class DeriverClass : BaseClass
    {
        public int DervedField = 0;
    }

    class Program
    {
        static void Main(string[] args)
        {
            var bc = new BaseClass();
            var dc = new DeriverClass();
            BaseClass[] bac = new BaseClass[] { bc, dc };
            foreach (var v in bac)
            {
                Type t = v.GetType();
                Console.WriteLine("Object type : {0}",t.Name);
                FieldInfo[] fi = t.GetFields();
                foreach (var f in fi)
                {
                    Console.WriteLine("    Field : {0}",f.Name);
                }
                Console.WriteLine() ;
            }
        }
    }
}
复制代码

使用Typeof运算符来获取Type对象。只需要提供类型名作为操作数,它就会返回Type对象的引用

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
namespace ConsoleApp2
{
    class BaseClass
    {
        public int MyFieldBase;
    }
    class DeriverClass : BaseClass
    {
        public int MyFieldDerived;
    }

    class Program
    {
        static void Main(string[] args)
        {
            Type tbc = typeof(DeriverClass);
            Console.WriteLine("Result is {0}",tbc.Name);
            Console.WriteLine("It has the following fields");
            FieldInfo[] fi = tbc.GetFields();
            foreach(var f in fi)
            {
                Console.WriteLine("    {0}",f.Name);
            }
        }
    }
}
复制代码

 

posted @   樱花落舞  阅读(203)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
历史上的今天:
2017-08-07 2017"百度之星"程序设计大赛 - 资格赛 度度熊与邪恶大魔王
点击右上角即可分享
微信分享提示