2

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

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

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

我像下面这样使用它;

Model.Get();

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

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

但我无法捕捉模型类类型。我怎样才能做到这一点?

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

注2:通常我使用它;

Business.Get<Model>();

我可以从模型表中获取所有数据。但我尝试使用它;

Model.Get();
4

2 回答 2

5

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

Do是定义在中的静态方法A。方法中没有B存在的元数据,Do因为它在A.

能够调用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;
    }
}
于 2015-10-07T12:19:14.680 回答
0

在处理方法时没有方法继承static。我相信,在课堂上调用Do()方法只是为了方便。B我想您的调用B.Do()已编译为A.Do()(因为B类不包含Do()方法声明)。这就是您的代码段返回的原因A

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

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

public class B : A
{
    public static void Do()
    {
    }
}
于 2015-10-07T12:19:24.813 回答