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

4 回答 4

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

或者:

var currentTypeName = new StackFrame(1, false).GetMethod().DeclaringType.Name;
于 2012-11-09T19:05:05.247 回答
1

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

于 2012-11-09T19:07:56.720 回答
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

我想这就是多态性的全部意义所在。

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

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

class B : A
{
}
于 2012-11-09T21:18:50.370 回答
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
于 2012-11-09T19:08:52.097 回答