获取c#中类的名称

本文关键字:获取 | 更新日期: 2023-09-27 18:11:01

我需要得到我目前所在的类的名称。问题是我在一个静态属性中。

获取c#中类的名称

如果不参考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>"。