C# - 反射获取字段/属性/方法

复制代码
using System;
using System.Reflection;
 
public class MyClass
{
    public int MyField;
    public int MyProperty { get; set; }
    public void MyMethod() { }
}
 
class Program
{
    static void Main()
    {
        Type type = typeof(MyClass);
 
        // 获取字段
        FieldInfo fieldInfo = type.GetField("MyField");
        Console.WriteLine("Field: " + fieldInfo.Name);
 
        // 获取属性
        PropertyInfo propertyInfo = type.GetProperty("MyProperty");
        Console.WriteLine("Property: " + propertyInfo.Name);
 
        // 获取方法
        MethodInfo methodInfo = type.GetMethod("MyMethod");
        Console.WriteLine("Method: " + methodInfo.Name);
    }
}

只搜索在当前类型中声明的成员,不包括继承的成员:BindingFlags.DeclaredOnly

复制代码
FieldInfo[] fields = type.GetFields(BindingFlags.DeclaredOnly);

BindingFlags各个枚举含义:

  • Default:表示使用默认的绑定规则,不指定任何特殊的标志。

  • IgnoreCase:表示忽略成员名称的大小写。

  • DeclaredOnly:表示只搜索在当前类型中声明的成员,不包括继承的成员。

  • Instance:表示搜索实例成员,即非静态的成员。

  • Static:表示搜索静态成员,即类级别的成员。

  • Public:表示搜索公共成员,即访问修饰符为public的成员。

  • NonPublic:表示搜索非公共成员,即访问修饰符为internal、protected或private的成员。

  • FlattenHierarchy:表示在搜索静态成员时,包括从基类继承的公共和受保护的静态成员,但不包括私有的静态成员和嵌套类型。

  • InvokeMethod:表示要调用一个方法,可以是构造函数、实例方法或静态方法。

  • CreateInstance:表示要创建一个类型的实例,调用与给定参数匹配的构造函数。

  • GetField:表示要获取一个字段的值,可以是实例字段或静态字段。

  • SetField:表示要设置一个字段的值,可以是实例字段或静态字段。

  • GetProperty:表示要获取一个属性的值,可以是实例属性或静态属性。

  • SetProperty:表示要设置一个属性的值,可以是实例属性或静态属性。

  • PutDispProperty:表示要调用一个COM对象上的PROPPUT成员,用于设置一个属性的值。

  • PutRefDispProperty:表示要调用一个COM对象上的PROPPUTREF成员,用于设置一个引用类型的属性的值。

  • ExactBinding:表示要求提供的参数类型必须与对应形参类型完全匹配,不允许进行类型转换。

  • SuppressChangeType:表示禁止进行类型转换,仅在COM互操作中使用。

  • OptionalParamBinding:表示返回参数数量与提供的参数数量匹配的成员集合,用于处理具有默认值或可变参数的方法。

  • IgnoreReturn:表示忽略方法的返回值,在COM互操作中使用。

  • DoNotWrapExceptions:表示不要将反射调用方法时产生的异常包装在TargetInvocationException中。

相关推荐
青春喂了后端13 分钟前
Go Sidecar Status 性能优化
开发语言·性能优化·golang
摇滚侠16 分钟前
MyBatis 入门到项目实战 MyBatis 分页插件 65-66
java·开发语言·sql·mybatis
CHHH_HHH22 分钟前
【C++】哈希表原理与实战:从冲突解决到性能优化
开发语言·数据结构·c++·学习·算法·哈希算法·散列表
Cloud_Shy61822 分钟前
解读《Effective Python 3rd Edition》:从练气到老魔(第七章 Item 48 - 50)
开发语言·人工智能·笔记·python·microsoft·学习方法
Y学院28 分钟前
C#游戏脚本开发全流程(Unity通用完整版)
游戏·unity·c#
A__tao40 分钟前
告别手写 Go 结构体!推荐一个支持注释解析的 YAML 转 Struct 在线工具
开发语言·后端·golang
何以解忧,唯有..43 分钟前
Go 语言语句分隔符详解:分号、换行与代码规范
开发语言·golang·代码规范
人邮异步社区1 小时前
C语言进阶的书籍推荐
c语言·开发语言
凡人叶枫1 小时前
Effective C++ 条款33:避免遮掩继承而来的名字
linux·服务器·开发语言·c++·嵌入式开发
10岁的博客1 小时前
NOIP2010普及组「接水问题」详解:模拟算法与优先队列解法
开发语言·c++·算法