如果我有一个继承自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() { } }
}
答案 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
{
}