示例:
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”。我需要将什么内容放入静态类中以使其返回(如果可能)?
答案 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;有关的事情;但是,如果它被用作静态类,那应该不是问题。