2011-10-11 48 views
3

我需要获取当前类中的类的名称。问题是我处于静态属性中。任何想法如何我可以做到这一点没有参考this获取C类中的类名#

+1

为什么你关心它是一个常量每个定义 - 静态属性不会继承下来的类。所以它总是完全一样的回报。 – TomTom

+2

@TomTom:它可能是一个泛型类,所以人们可能想知道泛型参数的值是什么。不同通用参数的名称可以被认为是不同的名称。 – Vlad

回答

7

如果你真的想要的话,虽然作为TomTom公司指出,你可能不会需要它:

System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name 
1

如果你是一个静态属性,你应该能够使类型名称的常量。

如果您在继承基类中有一个静态属性,并且您试图确定您所在的子类的类型,则无法使用静态属性执行此操作。原因是静态属性与基类类型相关联,而不是任何基类实例。改为使用常规属性,并使用GetType(),名称或类似名称。

1

以下调用应该给你当前类型的名称...

System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name 
1

您可以使用类似:

public static class MyClass 
{ 
    public static string FullName 
    { 
    get { return typeof(MyClass).FullName; } 
    } 
} 
3
System.Reflection.MethodInfo.GetCurrentMethod().DeclaringType.Name 
0

System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.ToString()这是一遍又一遍地提到 如果类型是通用的,则可能会出错。它不会计算出通用类型。

class Generic<T> 
{ 
    public static string ClassName 
    { 
     [MethodImpl(MethodImplOptions.NoInlining)] 
     get 
     { 
      return System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.ToString(); 
     } 
    } 
} 

此外,如果你不使用NoInlining指令代码,也许联到调用点,这将肯定不会得到你之后的结果。 以下代码将打印Generic``1[T],而不是从中调用它的特定实例。 解决方案相当明显,只需使用MakeGenericMethod和T即可获得正确的实例。

0

解决方案是相当明显的只是使用MakeGenericMethod与T来获得正确的实例。

但是,如果您想知道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将返回 “Generic`1 <DateTime>”。