获取当前类名,包括父类名?

4

如果我有一个继承自A的B和C类,是否有比使用StackFrame的GetFileName()更简单的方法(然后解析出ClassName.cs字符串)?

如果我使用this.GetType().Name,在父类中执行代码时它不会返回“A”。

示例代码

namespace StackOverflow.Demos
{
    class Program
    {
        public static void Main(string[] args)
        {
            B myClass = new C();
            string containingClassName = myClass.GetContainingClassName();
            Console.WriteLine(containingClassName); //should output StackOverflow.Demos.B
            Console.ReadKey();
        }
    }

    public class A { public A() { } }
    public class B : A { public B() { } }
    public class C : B { public C() { } }

}

4
如果没有至少一个小例子,很难理解您的问题。您能否展示一个类似于您尝试实现的功能的小代码片段,并告诉我们输出与您想要的有何不同? - Sergey Kalinichenko
抱歉,如果“this”是B类型,在其运行于父类A的构造函数中时,我想获取类名“A”。大多数我看到的问答代码都希望它返回“B”...但我希望它返回“A”。 - user1279437
我已经更新了我的答案以反映您需要的内容(请参见第一个答案)。可能有比这更好的方法;现在正在尝试中 - 但是目前这个方法可行。 - JohnLBevan
想一想,也许没有比使用重载更好的方法 - 因为获取容器类型的任何方法都需要在对象类上实现;因此将始终返回对象(即想象编写扩展方法为任何类的实例提供此功能,您将看到问题)。此外,通常在代码中,您会知道父类是什么,因为它在那里被声明 - 如果您将对象传递给不同的父级/容器,则先前的上下文(即变量声明时的父级是什么)将会丢失。 - JohnLBevan
4个回答

9
var yourType = GetType();
var baseType = yourType.BaseType;

或者,另一种选择:
var currentTypeName = new StackFrame(1, false).GetMethod().DeclaringType.Name;

嗨,丹尼尔,谢谢...但是你发布的替代代码在父类A的构造函数中运行时仍然返回“B”。 - user1279437
@user1279437 当创建一个 new C() 时,在运行基类的“链式”实例构造函数时,this 引用仍被视为 C 类。同样地,在运行从基类继承的方法时也是如此。如果你想要一个“常量”类型,比如在类 A 的某个实例构造函数或实例方法中,可以使用 typeof(A) 而不是 GetType() - Jeppe Stig Nielsen

1

我使用 myObject.GetType().FullName,它返回类的完全限定名称。对于您的情况,您可以使用 myObject.GetType().BaseType.FullName


0

选项1 :: 获取“container”类:

/**CODE**/

    public static void Main(string[] args)
    {
        B c = new C();
        Test(c);
        Console.ReadKey();
    }
    public static void Test(A a) { Console.WriteLine(typeof(A).ToString()); }
    public static void Test(B b) { Console.WriteLine(typeof(B).ToString()); }
    public static void Test(C c) { Console.WriteLine(typeof(C).ToString()); }

/**OUTPUT**/

    StackOverflow.Demos.B

选项2 :: 获取“容器”类:

/**CODE**/

    class Program
    {
        public static void Main(string[] args)
        {
            B myClass = new C();
            Console.WriteLine(myClass.GetContainerType()); //should output StackOverflow.Demos.B
            Console.ReadKey();
        }
    }

    public interface IGetContainerType
    {
        Type GetContainerType();
    }

    public class A: IGetContainerType 
    { 
        public A() { }
        public Type GetContainerType()
        {
            return typeof(A);
        }
    }
    public class B : A
    {
        public B() { }
        public new Type GetContainerType()
        {
            return typeof(B);
        }
    }
    public class C : B
    {
        public C() { }
        public new Type GetContainerType()
        {
            return typeof(C);
        }
    }

/**OUTPUT**/

    StackOverflow.Demos.B

回答类似但不同的问题;获取实例类/完整层次结构:

/**CODE**/

    class Program
    {

        public static void Main(string[] args)
        {
            C c = new C();
            Type myType = c.GetType();
            while(myType != null)
            {
                Console.WriteLine(myType);
                myType = myType.BaseType;
            }
            Console.ReadKey();
        }
    }


/**OUTPUT**/

    StackOverflow.Demos.C
    StackOverflow.Demos.B
    StackOverflow.Demos.A
    System.Object

0
当你使用GetType()或等效的this.GetType()时,你会得到类的实际类型。例如:
class A
{
  public void Test()
  {
    Console.WriteLine(GetType().Name);
  }
}

class B : A
{
}

然后:

var myB = new B();
myB.Test();   // writes B to the console

我想这就是多态性的全部含义。

如果您想要始终使用 A,没有多态性,请直接说:

class A
{
  public void Test()
  {
    Console.WriteLine(typeof(A).Name);
  }
}

class B : A
{
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接