C#以静态方法检索Classname

时间:2011-07-21 14:38:34

标签: c# reflection static classname

示例:

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”。我需要将什么内容放入静态类中以使其返回(如果可能)?

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:1)

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

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

    class ClassNameTesterBase<T>where T:ClassNameTester<T>
    {
        public static String getName() { return (typeof(T)).Name; }
    }

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

    class ClassNameTester1<T> : ClassNameTesterBase<T> ...
    class ClassNameTester2<T> : ClassNameTester1<T> ...

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

    class ClassNameTester1 : ClassNameTester1<ClassNameTester1> { }
    class ClassNameTester2 : ClassNameTester2<ClassNameTester2> { }

这里有一点需要注意的是,ClassNameTester2从ClassNameTester1&lt; T&gt;中获取其内部结构。但不能替代任何与ClassNameTester1&lt; ClassNameTester1&gt;有关的事情;但是,如果它被用作静态类,那应该不是问题。