6

例子:

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”。我必须在该静态类中添加什么才能使其返回(如果可能)?

4

2 回答 2

6

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

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

于 2011-07-21T14:42:01.640 回答
1

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

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

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

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

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

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

    类 ClassNameTester1 : ClassNameTester1<ClassNameTester1> { }
    类 ClassNameTester2 : ClassNameTester2<ClassNameTester2> { }

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

于 2011-07-21T15:14:38.937 回答