如何知道静态方法的 Class 名称

How to Know Static Methods's Class Name

我有一个 class,它有一些静态方法。我还有另一个 class 继承了我的第一个 class,如下所示;

public class Business
{
    public static DataTable Get()
    {
    }
}

public class Model : Business
{
    public int ID { get; set; }
    public string CompanyName { get; set; }
}

我是这样用的;

Model.Get();

在 Do 方法内部,我尝试捕捉模型的类型 class。我可以在 Do 方法中捕获如下所示的业务 class 类型;

public static DataTable Get()
{    
    Type t = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType;
}

但我无法捕捉到模型 class 类型。我该怎么做?

注意: 在业务 class selects 列中获取方法,从中调用它 class。这就是为什么我需要模型名称 class。模型 class 的原因名称将是 table 的名称,并且它将 table 模型中的 select 列。

注2 :一般我都这样用;

Business.Get<Model>();

我可以从模型 table 中获取所有数据。但我试着像这样使用它;

Model.Get();

你不能。没有什么叫做B.Do()。它隐含地意味着 A.Do().

DoA中定义的静态方法。 Do 方法中不存在 B 的元数据,因为它在 A 中定义。

能够调用B.Do();只是C#编译器为您提供的便利。请注意,resharper 会警告您使用派生类型使用 base class 成员。

请注意,即使您写

B.Do();

编译器将其转换为

call A.Do// Call IL

更新:至于更新的问题,我建议您使用实例方法而不是静态方法。

Model model = new Model();
model.Get();

在 get 内部你可以使用 GetType().Name 来获取当前实例的 class 名称。

public class Business
{
    public DataTable Get()
    {
         string className = this.GetType().Name;
    }
}

static方法时没有方法继承。 在 B class 中调用 Do() 方法只是为了方便,我相信。我想你的调用 B.Do() 被编译为 A.Do() (因为 B class 不包含 Do() 方法声明)。这就是为什么您的代码段 returns A.

为了让你的方法 return B 你应该写:

public class A
{
    public static void Do()
    {
    }
}

public class B : A
{
    public static void Do()
    {
    }
}