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

C#在静态方法中检索类名,c#,reflection,static,classname,C#,Reflection,Static,Classname,例如: namespace MyProgram.Testing { public class Test1 { public void TestMethod() { String actualType = this.GetType().FullName.ToString(); return; } public static String GetInheritedCla

例如:

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

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


静态成员不参与继承,这是一种逻辑,因为继承只有在处理实例时才有意义…

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

但是,您可以通过定义泛型基类型来解决此问题:

class ClassNameTesterBase<T>where T:ClassNameTester<T> { public static String getName() { return (typeof(T)).Name; } } 类ClassNameTester类ClassNameTester { 公共静态字符串getName(){return(typeof(T)).Name;} } 然后定义其他类型的兴趣:

class ClassNameTester1<T> : ClassNameTesterBase<T> ... class ClassNameTester2<T> : ClassNameTester1<T> ...
类ClassNameTester1我认为这是不可能的,静态成员始终位于定义它们的基类上。但我相信其他人可以提供更技术性的答案。 class ClassNameTester1 : ClassNameTester1<ClassNameTester1> { } class ClassNameTester2 : ClassNameTester2<ClassNameTester2> { }