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().FullNameクラスの完全修飾名を返す whichを使用します。あなたのシナリオでは、使用できます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

それがポリモーフィズムのすべてだと思います。

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 に答える