【问题标题】:Return class name in which a static method resides返回静态方法所在的类名
【发布时间】:2009-07-02 12:38:47
【问题描述】:

考虑以下代码:

public class MyClass
{
     public static string MyStaticMethod()
     {
          //string className = GetClassNameHere...
     }
}

是否可以获得静态方法所在类的名称?由于我使用的是静态方法,因此无法使用 this 指针来检索我当前正在工作的对象的类型。

【问题讨论】:

  • 请详细说明“这个指针”是什么意思
  • @AB Kolan:我认为 Russel 指的是关键字“this”。

标签: c# static-methods


【解决方案1】:

试试下面的

return typeof(MyClass).Name;

也可以

return MethodBase.GetCurrentMethod().DeclaringType.Name;

【讨论】:

    【解决方案2】:

    你可以这样做...

    String className = typeof(MyClass).Name;
    

    【讨论】:

      【解决方案3】:

      我可能在这里完全忽略了这一点,但是字符串“MyClass”有什么问题?

      public class MyClass
      {
           public static string MyStaticMethod()
           {
                string className = "MyClass";
                Console.WriteLine(className);
           }
      }
      

      您可能会争辩说,如果 MyClass 是继承的,那么您会想要继承类的名称。然后考虑以下几点:

      public class MyClass
      {
          public static string MyStaticMethod()
          {
              string className = typeof(MyClass).Name;
              Console.WriteLine(className);
          }
      }
      public class MyOtherClass : MyClass{ }
      

      现在,如果您调用MyOtherClass.SomeMethod,您认为您会在控制台中看到什么?答案是“MyClass”。因此,动态查找类名将得到与在字符串中输入完全相同的结果。我可以看到通过反射获得它的唯一好处是,如果你重命名类,它仍然会呈现正确的结果。

      【讨论】:

      • 他可能希望它是重构安全的。当然还有继承,虽然这很棘手。
      • 为了保证重构的安全,这可能是一个相当不错的性能损失。正如我在回答中指出的那样,没有继承优势,因为它是一种静态方法;它将始终返回基类的名称。
      【解决方案4】:

      试试这个:

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Reflection;
      
      namespace ConsoleApplication1
      {
          class Program
          {
              static void Main(string[] args)
              {
                  MethodBase m = MethodInfo.GetCurrentMethod();
                  MemberInfo info = (MemberInfo)m;
                  Console.WriteLine(info.DeclaringType.FullName);
                  Console.ReadKey();
              }
          }
      }
      

      控制台将显示“ConsoleApplication1.Program”=)

      【讨论】:

      • OP 正在寻找类名,而不是方法名。
      • 另外,您不需要强制转换为 MemberInfo。 m.Name 应该足够了。
      • @JaredPar - 是的,我意识到我的错误,d'oh =)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      • 1970-01-01
      • 2013-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-26
      相关资源
      最近更新 更多