淡若轻风

博客园 首页 新随笔 联系 订阅 管理

一、先给你一个“解剖用”的完整类

 
public class Person : Human, IDisposable
{
    // ===== 字段(Fields)=====
    public int Id;
    private string _secret;

    // ===== 属性(Properties)=====
    public string Name { get; set; }
    protected int Age { get; private set; }

    // ===== 构造函数(Constructors)=====
    public Person() { }
    public Person(string name) { }

    // ===== 方法(Methods)=====
    public void Speak() { }
    private void Think() { }

    // ===== 事件(Events)=====
    public event EventHandler? Changed;

    // ===== 接口实现 =====
    public void Dispose() { }
}

public class Human
{
    public string Species { get; set; }
}

  


二、Type.Get* 方法总览(先给全景图)

方法返回类型对应类的哪一部分
GetFields() FieldInfo[] 字段
GetProperties() PropertyInfo[] 属性
GetMethods() MethodInfo[] 方法
GetConstructors() ConstructorInfo[] 构造函数
GetEvents() EventInfo[] 事件
GetInterfaces() Type[] 实现的接口
GetMembers() MemberInfo[] 以上所有成员
GetNestedTypes() Type[] 内部类
GetBaseType() / .BaseType Type 父类

三、逐个方法「拆解说明 + 示例输出」


1️⃣ GetFields —— 类的“字段区”

var fields = typeof(Person).GetFields( BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

  👉 获取的是:

 
public int Id; 
private string _secret;

  输出示例:

Id
_secret

  

📌 对应 C/C++ struct 成员
📌 不包括属性!


2️⃣ GetProperties —— 类的“属性区”

 
var props = typeof(Person).GetProperties(
    BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

👉 获取的是:

 
public string Name { get; set; }
protected int Age { get; private set; }
public string Species { get; set; } // 继承来的

  

输出示例:
Name
Age
Species

⚠ 注意:

  • 属性 ≠ 字段

  • 属性背后有 getter / setter 方法


3️⃣ GetMethods —— 类的“行为区”

 
var methods = typeof(Person).GetMethods(
    BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

 

👉 获取的是:

 
public void Speak()
private void Think()
public void Dispose()
public string ToString()   // object 继承

 

输出示例(部分):

 
Speak
Think
Dispose
ToString
GetHashCode

 

⚠ 包含父类和 object 的方法(除非过滤)


4️⃣ GetConstructors —— 构造函数

 
 
var ctors = typeof(Person).GetConstructors();

  

👉 获取的是:

 
public Person()
public Person(string name)

 


5️⃣ GetEvents —— 事件

 
var events = typeof(Person).GetEvents();

  

👉 获取的是:

 
public event EventHandler Changed;

  


6️⃣ GetInterfaces —— 实现的接口

 
var interfaces = typeof(Person).GetInterfaces();

  

👉 获取的是:
 
IDisposable

 


7️⃣ GetMembers —— “大杂烩”

 
var members = typeof(Person).GetMembers(
    BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

  

👉 包含:

  • 字段

  • 属性

  • 方法

  • 构造函数

  • 事件

输出示例(节选):

 
Id
_secret
Name
Age
Speak
Think
Dispose
Changed

  📌 所有 MemberInfo 的合集


8️⃣ BaseType / GetBaseType —— 继承结构

 
Type baseType = typeof(Person).BaseType;

  

👉 得到:

 
Human

  


9️⃣ GetNestedTypes —— 内部类

 
public class A
{
    public class B { }
}

  

typeof(A).GetNestedTypes();

  

 

👉 得到:

 
B

  


四、类结构 vs Get* 方法对照图(核心)

 
class Person
├── Fields          → GetFields()
├── Properties      → GetProperties()
├── Methods         → GetMethods()
├── Constructors    → GetConstructors()
├── Events          → GetEvents()
├── Interfaces      → GetInterfaces()
├── Nested Types    → GetNestedTypes()
└── Base Class      → BaseType

  


五、你这种工程场景的“正确姿势”(结合你背景)

你经常做的事情:

  • C# ↔ C struct

  • DLL 参数映射

  • 大型参数结构体

👉 正确选择:

  
目标推荐 API
数据字段 GetFields()
业务模型 GetProperties()
自动映射 Fields + Properties
调试/分析 GetMembers()

六、一句话总结(你可以记这个)

Type.GetXxx() 就是“类结构的 X 区”

  • 字段 → GetFields

  • 属性 → GetProperties

  • 行为 → GetMethods

  • 全部 → GetMembers

posted on 2025-12-22 09:35  淡若轻风  阅读(0)  评论(0)    收藏  举报