C# 如何知道静态方法的类名

C# 如何知道静态方法的类名,c#,reflection,methodbase,C#,Reflection,Methodbase,我有一个类,它有一些静态方法。我还有一个类继承了我的第一个类,如下所示 public class Business { public static DataTable Get() { } } public class Model : Business { public int ID { get; set; } public string CompanyName { get; set; } } Model.Get(); 我使用它如下 public cl

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

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

public class Model : Business
{
    public int ID { get; set; }
    public string CompanyName { get; set; }
}
Model.Get();
我使用它如下

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

public class Model : Business
{
    public int ID { get; set; }
    public string CompanyName { get; set; }
}
Model.Get();
在Do方法内部,我试图捕获模型类的类型。我能抓住下面这样的商务类里面的做方法

public static DataTable Get()
{    
    Type t = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType;
}
但是我不能理解模型类的类型。我该怎么做

注意:业务类中的Get方法选择从哪个类调用它的列。这就是为什么我需要模型类的名称。模型类的原因名称将是表的名称,它将从表模型中选择列

注2:通常我会像这样使用它

Business.Get<Model>();
Model.Get();

你不能。没有什么叫B.Do。它隐含的意思是A.Do

Do是a中定义的静态方法。Do方法中不存在a中定义的B元数据

能够呼叫B.Do;这只是C编译器为您提供的一种方便。请注意,resharper将警告您使用派生类型的基类成员

请注意,即使你写信

B.Do();
编译器将其转换为

call A.Do// Call IL
更新:对于更新后的问题,我建议您使用实例方法,而不是静态方法

Model model = new Model();
model.Get();
在get中,您可以使用GetType.Name来获取当前实例的类名

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

当涉及静态方法时,没有方法继承。 我相信,在B类中调用Do方法只是为了方便。我假设您的调用B.Do被编译为A.Do,因为B类不包含Do方法声明。这就是代码段返回A的原因

为了使您的方法返回B,您应该写:

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

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

我有一个基类,它做一些事情,从哪个类调用它。这就是为什么我需要B类的名称。原因B类的名称将是表的名称,它将从表中选择列B@thrashead我想在获取表名时需要某种多态行为。也许,用你想要达到的目标的更多信息更新这个问题,或者用所有必要的信息问一个新问题来回答这个问题。ThanksI用便条更新了问题。我尝试开发一个类似实体框架的框架,B类是一个有模型成员的类,它继承一个类来获得它的方法。但我不想使用虚拟方法和重写方法。没有什么会被覆盖,我只需要一个表的类型来捕捉成员属性,从而生成一些函数,如select、insert。如果没有看到您的代码,我无法提供太多。我建议去掉那个静态的,让它成为A中的实例方法。然后一个虚拟属性说TableName,它在B中被重写以返回B。或者属性也会有帮助。但是你需要向我们展示更多的代码来帮助我们;如果我这样做,我不需要继承类。我可以把它叫做A.Do;它还为表B创建了select和insert方法。我试着像B.Do一样使用;代替B.做;或A.做;