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

本文关键字:检索 静态方法 | 更新日期: 2023-09-27 18:03:18

示例:

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"。我必须在那个静态类中放入什么才能让它返回(如果可能的话(?

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

这是不可能的。当您调用Test2.GetInheritedClassName时,实际上调用的是Test1.GetInheritedClassName,因为Test2.GetInheritedClassName并不真正存在(顺便说一句,像Resharper这样的一些工具会显示警告:通过派生类型访问类型的静态成员(

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

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

然而,你可以通过定义一个通用的基本类型来绕过这个问题:

class ClassNameTesterBase<T>其中T:ClassNameTester<T>{公共静态字符串getName(({return(typeof(T((.Name;}}

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

class ClassNameTester1<T>ClassNameTesterBase<T>。。class ClassNameTester2<T>ClassNameTester1<T>。。

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

class ClassNameTester1:ClassNameTester 1<ClassNameTester1>{}class ClassNameTester2:ClassNameTester 2<ClassNameTester2>{}

这里需要注意的是,ClassNameTester2从ClassNameTesterC1<T>但是不能替代与ClassNameTester1<ClassNameTester1>;不过,如果它被用作静态类,那应该不是问题。