示例:
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>其中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>;不过,如果它被用作静态类,那应该不是问题。