C#在静态方法中检索类名
Posted
技术标签:
【中文标题】C#在静态方法中检索类名【英文标题】:C# Retrieving Classname in a static method 【发布时间】:2011-10-10 07:23:37 【问题描述】:例子:
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”。我必须在该静态类中添加什么才能使其返回(如果可能)?
【问题讨论】:
我认为这是不可能的,静态成员总是存在于定义它们的基类上。但我相信其他人可以提供更具技术性的答案。 【参考方案1】:这是不可能的。当您调用Test2.GetInheritedClassName
时,实际上调用的是Test1.GetInheritedClassName
,因为Test2.GetInheritedClassName
并不真正存在(顺便说一句,Resharper 之类的一些工具会显示警告:Access to a static member of a type via a派生类型)
静态成员不参与继承,这是合乎逻辑的,因为只有在处理实例时继承才有意义...
【讨论】:
【参考方案2】:打印出类型的代码是基类方法。除了上面提供的罕见的反射场景外,执行不会受到使用派生类型或基类型调用方法的影响,因此系统不区分。
但是,您可以通过定义通用基类型来解决这个问题:
类 ClassNameTesterBase然后定义其他类型的兴趣:
类 ClassNameTester1如果需要,可以定义叶类:
类 ClassNameTester1 : ClassNameTester1这里有一点需要注意的是 ClassNameTester2 从 ClassNameTester1
【讨论】:
以上是关于C#在静态方法中检索类名的主要内容,如果未能解决你的问题,请参考以下文章