获取c#中类的名称
本文关键字:获取 | 更新日期: 2023-09-27 18:11:01
我需要得到我目前所在的类的名称。问题是我在一个静态属性中。
this
,我该怎么做?如果您真的需要它,尽管正如TomTom指出的,您可能不需要它:
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name
System.Reflection.MethodInfo.GetCurrentMethod().DeclaringType.Name
如果在静态属性中,应该能够将类型名设置为常量。
如果您在继承的基类中有一个静态属性,并且您正在尝试确定您所在的子类的类型,则无法使用静态属性完成此操作。原因是静态属性与基类类型相关联,而不是与任何基类实例相关联。使用常规属性,并使用GetType()。名称或类似名称
下面的调用将为您提供当前类型的名称…
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name
你可以这样写:
public static class MyClass
{
public static string FullName
{
get { return typeof(MyClass).FullName; }
}
}
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.ToString()
如果Type是泛型的话,这个方法一遍又一遍地被提到,可能是错误的。它不会计算出泛型。
class Generic<T>
{
public static string ClassName
{
[MethodImpl(MethodImplOptions.NoInlining)]
get
{
return System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.ToString();
}
}
}
另外,如果你不使用NoInlining
指令,你的代码可能内联到callsite,这绝对不会产生你想要的结果。下面的代码将打印Generic``1[T]
,而不是从中调用它的特定实例。解决方案非常明显,只需使用MakeGenericMethod
和T来获得正确的实例。
解决方案是相当明显的,只需使用带有T的MakeGenericMethod来获得正确的实例。
但是如果你想知道T的名字,你不能使用MakeGenericMethod
。另一个解决方案是使用泛型方法添加静态类:
public static class Helper
{
public static string GetName<T>()
{
Type type = typeof(T);
Type[] genericArguments = type.GetGenericArguments();
return string.Format("{0}<{1}>", type.Name, string.Join(",", genericArguments.Select(arg => arg.Name)));
}
}
没有将属性ClassName
更改为
public static string ClassName
{
get
{
return Helper.GetName<Generic<T>>();
}
}
则您将获得正确的通用名称,例如,对Generic<DateTime>.ClassName
的调用将返回"通用1 & lt; DateTime>"。