cop*_*art 6 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();
}
}
Run Code Online (Sandbox Code Playgroud)
无论如何,我希望它返回"MyProgram.Testing.Test2",而是Test2.GetInheritedClassName()返回"MyProgram.Testing.Test1".我需要将什么内容放入该静态类中以使其返回(如果可能)?
这是不可能的.当你调用时Test2.GetInheritedClassName
,它实际上Test1.GetInheritedClassName
是被调用的,因为Test2.GetInheritedClassName
它确实不存在(顺便说一句,像Resharper这样的工具会显示一个警告:通过派生类型访问类型的静态成员)
静态成员不参与继承,这是合乎逻辑的,因为继承仅在处理实例时才有意义...
打印出类型的代码是基类方法。除了上面提供的罕见反射场景之外,执行不会受到使用派生类型还是基类型调用该方法的影响,因此系统不做区分。
但是,您可以通过定义通用基类型来解决这个问题:
类 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> 相关的任何内容;不过,如果它被用作静态类,那应该不是问题。
归档时间: |
|
查看次数: |
812 次 |
最近记录: |