我有以下课程:
public class dlgBoughtNote : dlgSpecifyNone
{
public com.jksb.reports.config.cases.BoughtNoteReport _ReportSource;
public dlgBoughtNote()
{
btnPreview.Click += new EventHandler(Extended_LaunchReport);
this.Text = "Bought Note Print";
}
protected override void InitReport()
{
_ReportSource = new com.jksb.reports.config.cases.BoughtNoteReport(null);
ReportSourceName = _ReportSource;
}
}
从技术上讲,如果我调用以下构造函数dlgBoughtNote()
public dlgBoughtNote()
{
btnPreview.Click += new EventHandler(Extended_LaunchReport);
this.Text = "Bought Note Print";
MessageBox.Show(this.Name);
}
我应该得到“dlgBoughtNote”的结果,但我得到的是“dlgSpecifyNone”。除了我正在做的事情之外,有什么方法可以得到当前班级的名字。
答案 0 :(得分:4)
获取当前类名称的最简单方法可能是this.GetType().Name
。
答案 1 :(得分:2)
您可以在GetType()
上调用this
来获取实例的类型,并使用该类型的Name
属性来获取当前类型的名称。调用this.GetType()
返回实例化的类型,而不是定义当前正在执行的方法的类型,因此在基类中调用它将为您提供从this
创建的派生子类的类型。
有点令人困惑......这是一个例子:
public class BaseClass
{
public string MyClassName()
{
return this.GetType().Name;
}
}
public class DerivedClass : BaseClass
{
}
...
BaseClass a = new BaseClass();
BaseClass b = new DerivedClass();
Console.WriteLine("{0}", a.MyClassName()); // -> BaseClass
Console.WriteLine("{0}", b.MyClassName()); // -> DerivedClass
答案 2 :(得分:1)
你从来没有告诉我们你的this.Name
是什么。但是,如果需要获取运行时类型名称,则可以使用上述任何答案。那只是:
this.GetType().Name
你喜欢的任何组合。
但是,我想,你试图做的是拥有一个属性,为任何派生(或基础)类返回一定的值。那么你需要至少有一个protected virtual
属性,你需要在每个派生类中重写:
public class dlgSpecifyNone
{
public virtual string Name
{
get
{
return "dlgSpecifyNone";//anything here
}
}
}
public class dlgBoughtNote : dlgSpecifyNone
{
public override string Name
{
get
{
return "dlgBoughtNote";//anything here
}
}
}
但如果this.GetType().Name
解决了这个问题,那么这显然是不必要的。
答案 3 :(得分:0)
我是这样做的,我一直用它来记录器:
using System.Reflection;
//...
Type myVar = MethodBase.GetCurrentMethod().DeclaringType;
string name = myVar.Name;