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

时间:2012-11-09 19:02:37

标签: c# .net

如果我有一个继承自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 个答案:

答案 0 :(得分:8)

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

或者:

var currentTypeName = new StackFrame(1, false).GetMethod().DeclaringType.Name;

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

/**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

答案 3 :(得分: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

我猜这就是polymorphism的全部内容。

如果你想要A,没有多态,只需说:

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

class B : A
{
}