You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C#中Method本身的类型是什么?相关技术实践疑问

关于C#中方法的类型疑惑解答

嘿,这个问题问得特别到位!既然C#号称纯面向对象、所有事物都派生自System.Object,那方法本身的类型到底是什么?咱们一步步理清楚:

1. 方法本身不是直接的对象,但可以被包装成委托对象

在C#里,方法本身是类/结构体的成员,并不是一个独立的对象实例。但当你需要把方法当作“值”来传递(比如赋值给变量、作为参数传给其他方法)时,C#会自动把它包装成一个**委托(Delegate)**对象——而所有委托类型最终都继承自System.Object,这就完美契合了“一切皆对象”的规则。

2. 为什么StackTrace/StackFrame只返回类名?

你用StackTraceStackFrame拿到的GetMethod()返回的是MethodBase(通常是它的子类MethodInfo),这是反射元数据类型,用来描述方法的信息(比如所属类、参数、返回值等),而不是方法本身的“对象实例”。所以你看到的类名,是这个方法所属的类型,而非方法对应的对象类型。

3. 赋值给Func时发生了什么?

当你把一个返回字符串的方法赋值给Func<string>变量时,C#编译器会自动帮你创建一个Func<string>类型的委托实例,这个实例就是一个正经的对象:

  • 它继承自System.MulticastDelegate,而MulticastDelegate又继承自System.Delegate,最终System.Delegate的父类就是System.Object
  • 你可以直接对这个委托实例做对象级别的操作,比如获取它的类型:
using System;

class Example
{
    static string MyTestMethod() => "Hi there!";

    static void Main()
    {
        Func<string> myFunc = MyTestMethod;
        
        // 打印委托的具体类型
        Console.WriteLine(myFunc.GetType()); // 输出:System.Func`1[System.String]
        // 追踪它的继承链
        Console.WriteLine(myFunc.GetType().BaseType); // System.MulticastDelegate
        Console.WriteLine(myFunc.GetType().BaseType.BaseType); // System.Delegate
        Console.WriteLine(myFunc.GetType().BaseType.BaseType.BaseType); // System.Object
    }
}

4. 为什么直接操作方法名会报错?

因为方法名本身只是一个“成员标识符”,不是对象引用。你不能直接对MyTestMethod调用GetType()或者其他对象方法——只有当它被包装成委托实例后,才具备对象的特性,能被当作对象来操作。

简单总结:C#里的方法本身不是对象,但可以通过委托被包装成对象,而委托完全符合“派生自System.Object”的要求。你之前用反射拿到的是方法的元数据描述,不是方法对应的委托实例哦~

内容的提问来源于stack exchange,提问作者Kangjun Heo

火山引擎 最新活动