C# 如何在.NET的基类静态方法中获取类类型?

C# 如何在.NET的基类静态方法中获取类类型?,c#,.net,reflection,inheritance,C#,.net,Reflection,Inheritance,我想做的一切类似于: public abstract class BaseClass { public static Type GetType() { return typeof(BaseClass); } } 但当我推导出它时 public class DerivedClass : BaseClass { } 我想去 Assert.AreEqual(typeof(DerivedClass), DerivedClass.GetType()); 如何更

我想做的一切类似于:

public abstract class BaseClass
{
    public static Type GetType()
    {
        return typeof(BaseClass);
    }
}
但当我推导出它时

public class DerivedClass : BaseClass
{
}
我想去

Assert.AreEqual(typeof(DerivedClass), DerivedClass.GetType());

如何更改基类以使此断言为真?

您不能这样做,因为从某个基类到派生类型的唯一路由来自实例,而静态方法不接受实例

我希望您的示例是为了简单起见,因为否则重新实现GetType似乎有点毫无意义,因为object.GetType将完全满足您的需要

如果您确实需要通过静态调用的方法来实现这一点,那么您不能这样做,因为正如我在第一段中所说,静态方法实际上没有可用的类型信息

如果你真的通过一个实例调用这个方法,但我必须问为什么!?然后您可以执行以下操作之一

a使您的方法成为基础上的实例方法。然后,它可以使用.Net base方法执行此操作。GetType将返回实例的最终子类型

b为基类定义一个扩展方法,该方法执行非常类似的操作:

public static Type GetType2(this BaseClass instance)
{
  return instance.GetType();
}

您不能这样做,因为从派生类型的一个基到它的唯一路由是从一个实例,而静态方法不接受一个实例

我希望您的示例是为了简单起见,因为否则重新实现GetType似乎有点毫无意义,因为object.GetType将完全满足您的需要

如果您确实需要通过静态调用的方法来实现这一点,那么您不能这样做,因为正如我在第一段中所说,静态方法实际上没有可用的类型信息

如果你真的通过一个实例调用这个方法,但我必须问为什么!?然后您可以执行以下操作之一

a使您的方法成为基础上的实例方法。然后,它可以使用.Net base方法执行此操作。GetType将返回实例的最终子类型

b为基类定义一个扩展方法,该方法执行非常类似的操作:

public static Type GetType2(this BaseClass instance)
{
  return instance.GetType();
}

静态方法不会被继承

当通过基类的一个派生类调用基类的静态方法时,编译器用基类替换DerivedClass。例如,以下是调用DerivedClass.GetType的IL代码:


静态方法不会被继承

当通过基类的一个派生类调用基类的静态方法时,编译器用基类替换DerivedClass。例如,以下是调用DerivedClass.GetType的IL代码:


这甚至不会编译-你能澄清你的意图吗?这没有任何意义。为什么要从静态方法调用GetType?@asawyer@Marc我更正了示例,现在它已经编译并测试了it@Gabe这是一个过于简单的例子,这就是它没有意义的原因。@Marc@Gabe实际上在我的代码中GetType不在示例中是CreateServiceHost,它需要知道哪个派生服务类正在调用它。这甚至不会编译-你能澄清你的意图吗?这没有任何意义。为什么要从静态方法调用GetType?@asawyer@Marc我更正了示例,现在它已经编译并测试了it@Gabe这是一个过于简单的示例,这就是它没有意义的原因。@Marc@Gabe实际上在我的代码中GetType不在示例中是CreateServiceHost,它需要知道哪个派生服务类正在调用它。