C#成员函数获取当前所在类的名字的四种方法

 更新时间:2026年02月25日 09:24:40   作者:Yashar Qian  
文章介绍了在C#中获取当前类名的四种方法:使用this.GetType().Name、nameof(MyClass)、typeof(MyClass).Name和MethodBase.GetCurrentMethod().DeclaringType.Name,并比较了它们的适用场景、是否受继承影响以及性能特点,需要的朋友可以参考下

C# 成员函数中如何拿到当前所在类的名字?

在 C# 中,在类的成员函数(实例方法)中获取当前类的名称,有几种常用方法:

1. 使用this.GetType()(推荐)

public class MyClass
{
    public void PrintClassName()
    {
        string className = this.GetType().Name;       // 类名(不含命名空间)
        string fullName = this.GetType().FullName;    // 完全限定名(含命名空间)
        
        Console.WriteLine(className);    // 输出 "MyClass"
        Console.WriteLine(fullName);    // 输出 "Namespace.MyClass"(如果有命名空间)
    }
}
  • 适用场景:适用于实例方法,能正确反映运行时类型(包括继承的情况)。
  • 注意:如果子类继承 MyClassthis.GetType().Name 会返回子类的名称。

2. 使用nameof(编译时确定)

public class MyClass
{
    public void PrintClassName()
    {
        string className = nameof(MyClass); // 编译时替换为 "MyClass"
        Console.WriteLine(className);      // 输出 "MyClass"
    }
}
  • 适用场景:适用于编译时已知类名,不受继承影响(即使子类调用,仍然返回 MyClass)。
  • 优点:性能最佳(编译时静态解析)。

3. 使用typeof(MyClass)

public class MyClass
{
    public void PrintClassName()
    {
        string className = typeof(MyClass).Name;      // 类名(不含命名空间)
        string fullName = typeof(MyClass).FullName;   // 完全限定名(含命名空间)
        
        Console.WriteLine(className);    // 输出 "MyClass"
        Console.WriteLine(fullName);    // 输出 "Namespace.MyClass"
    }
}
  • 适用场景:适用于编译时已知类名,不受实例影响(静态方法也可用)。
  • 注意:和 nameof 类似,不受继承影响。

4. 使用MethodBase.GetCurrentMethod()(反射方式,适用于静态方法)

using System.Reflection;

public class MyClass
{
    public void PrintClassName()
    {
        string className = MethodBase.GetCurrentMethod().DeclaringType.Name;
        Console.WriteLine(className);  // 输出 "MyClass"
    }
}
  • 适用场景:适用于静态方法或无法使用 this 的情况。
  • 缺点:性能较差(反射开销)。

如何选择?

方法适用场景是否受继承影响性能
this.GetType().Name实例方法,需运行时类型✔️ 是(返回实际类型)一般
nameof(MyClass)编译时已知类名❌ 否(固定类名)最佳
typeof(MyClass).Name编译时已知类名❌ 否(固定类名)最佳
MethodBase(反射)静态方法或无 this✔️ 是较差

示例:继承情况下的区别

public class ParentClass
{
    public void PrintName()
    {
        Console.WriteLine(this.GetType().Name);  // 实际类型(可能是子类)
        Console.WriteLine(nameof(ParentClass));  // 固定 "ParentClass"
        Console.WriteLine(typeof(ParentClass).Name); // 固定 "ParentClass"
    }
}

public class ChildClass : ParentClass { }

// 测试
var child = new ChildClass();
child.PrintName();

输出:

ChildClass   // this.GetType().Name
ParentClass  // nameof
ParentClass  // typeof

总结

  • 如果想获取 运行时实际类型(包括继承情况),用 this.GetType().Name
  • 如果只需要 当前类的编译时名称(不受继承影响),用 nameof(MyClass)typeof(MyClass).Name
  • 如果是在 静态方法 里,可以用 MethodBase.GetCurrentMethod().DeclaringType.Nametypeof(MyClass).Name

以上就是C#成员函数获取当前所在类的名字的四种方法的详细内容,更多关于C#成员函数获取所在类的名字的资料请关注脚本之家其它相关文章!

相关文章

  • C#获取网页源代码的方法

    C#获取网页源代码的方法

    这篇文章主要介绍了C#获取网页源代码的方法,涉及C#基于自定义函数读取网页html代码的方法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • 详解WPF如何在Panel中实现设置所有子项间距

    详解WPF如何在Panel中实现设置所有子项间距

    这篇文章主要为大家详细介绍了WPF如何在Panel中实现设置所有子项间距,本文借鉴了 Qt 中的 Spacing 设置方法,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-10-10
  • C#中可枚举类型详解

    C#中可枚举类型详解

    这篇文章主要介绍了C#中可枚举类型,IEnumerable和IEnumerator接口j及其泛型实现和迭代器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • C#同步网络时间的方法实例详解

    C#同步网络时间的方法实例详解

    这篇文章主要介绍了C#同步网络时间的方法,以实例形式较为详细的分析了C#获取网络时间与同步本机系统时间的相关技巧,非常具有实用价值,需要的朋友可以参考下
    2015-05-05
  • C#基于Spire.Doc for .NET从URL下载Word文档的实现方案

    C#基于Spire.Doc for .NET从URL下载Word文档的实现方案

    在日常的软件开发中,我们经常会遇到这样的场景:需要从一个指定的 URL 地址下载文件,当涉及到 Word 文档这类复杂的二进制格式时,情况就变得不那么简单了,本文将深入探讨在 C# 应用程序中,如何高效、可靠地从 URL 下载 Word 文档,需要的朋友可以参考下
    2025-12-12
  • C# 利用代理爬虫网页的实现方法

    C# 利用代理爬虫网页的实现方法

    这篇文章主要介绍了C# 利用代理爬网页的实现方法的相关资料,希望通过本能帮助到大家实现这样的功能,需要的朋友可以参考下
    2017-10-10
  • Winform之TextBox输入日期格式验证yyyy-mm-dd

    Winform之TextBox输入日期格式验证yyyy-mm-dd

    Winform之TextBox输入日期格式验证yyyy-mm-dd的实例与正则表达式,需要的朋友可以参考一下
    2013-02-02
  • C# WPF 父控件通过使用可视化树找到子控件的示例代码

    C# WPF 父控件通过使用可视化树找到子控件的示例代码

    这篇文章主要介绍了C# WPF 父控件通过使用可视化树找到子控件的示例代码,需要的朋友可以参考下
    2018-08-08
  • C#使用HttpClient进行Post请求出现超时问题的解决及优化

    C#使用HttpClient进行Post请求出现超时问题的解决及优化

    最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也没有问题,那么问题就出在我的请求端了,所以本文给大家介绍了C# 使用HttpClient进行Post请求总是出现超时问题的优化,需要的朋友可以参考下
    2025-01-01
  • c#值类型和引用类型使用示例

    c#值类型和引用类型使用示例

    这篇文章主要介绍了c#值类型和引用类型使用示例,需要的朋友可以参考下
    2014-04-04

最新评论