C#在静态方法中检索类名

Posted

技术标签:

【中文标题】C#在静态方法中检索类名【英文标题】:C# Retrieving Classname in a static method 【发布时间】:2011-10-10 07:23:37 【问题描述】:

例子:

namespace MyProgram.Testing


    public class Test1
    
        public void TestMethod()
        
            String actualType = this.GetType().FullName.ToString();
            return;
        

        public static String GetInheritedClassName()
        
            return System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.FullName;
        

    

    public class Test2 : Test1
    
    

    public class Test3
    
       String test2ClassName = Test2.GetInheritedClassName();
    

无论如何,我希望它返回“MyProgram.Testing.Test2”,但 Test2.GetInheritedClassName() 返回“MyProgram.Testing.Test1”。我必须在该静态类中添加什么才能使其返回(如果可能)?

【问题讨论】:

我认为这是不可能的,静态成员总是存在于定义它们的基类上。但我相信其他人可以提供更具技术性的答案。 【参考方案1】:

这是不可能的。当您调用Test2.GetInheritedClassName 时,实际上调用的是Test1.GetInheritedClassName,因为Test2.GetInheritedClassName 并不真正存在(顺便说一句,Resharper 之类的一些工具会显示警告:Access to a static member of a type via a派生类型)

静态成员不参与继承,这是合乎逻辑的,因为只有在处理实例时继承才有意义...

【讨论】:

【参考方案2】:

打印出类型的代码是基类方法。除了上面提供的罕见的反射场景外,执行不会受到使用派生类型或基类型调用方法的影响,因此系统不区分。

但是,您可以通过定义通用基类型来解决这个问题:

类 ClassNameTesterBase其中 T:ClassNameTester 公共静态字符串 getName() return (typeof(T)).Name;

然后定义其他类型的兴趣:

类 ClassNameTester1 ... 类 ClassNameTester2 ...

如果需要,可以定义叶类:

类 ClassNameTester1 : ClassNameTester1 类 ClassNameTester2 : ClassNameTester2

这里有一点需要注意的是 ClassNameTester2 从 ClassNameTester1 派生其内部结构,但不能替代与 ClassNameTester1 相关的任何内容;不过,如果它被用作静态类,那应该不是问题。

【讨论】:

以上是关于C#在静态方法中检索类名的主要内容,如果未能解决你的问题,请参考以下文章

C#中方法的调用

C# 静态方法 静态属性 调用静态方法

C# 静态类和非静态类的区别

如何在 Visual Studio 2022 C# 编辑器中取消加粗静态方法?

静态方法怎么调用

C# 静态成员和方法的学习小结