我在调试过程中遇到了这段代码。
private bool HasBaseType(Type type, out Type baseType)
{
Type originalType = type.GetType();
baseType = GetBaseType(type);
return baseType != originalType;
}
我最初的想法是,方法第一行中的type.GetType()
总是会产生等价的typeof(System.Type)
,这对我来说在上下文中看起来毫无意义。但是,Type
GetType()
会覆盖将从Object
继承的GetType()
版本。然后,MSDN suggests(不要与三个静态版本混淆)说originalType
方法返回“当前类型”。没有给出进一步的相关解释。
那么,上述方法中type
的值是否等于typeof(System.Type)
或originalType
?我从文档中不太确定。如果type
等同于type
,那么它是GetBaseType
的副本,这样,如果originalType
方法改变其参数,{{无论type
内发生什么,1}}仍然等同于原始形式的GetBaseType
?
答案 0 :(得分:6)
1
GetType未定义为虚拟,因此无法覆盖。 System.Type不会覆盖对象的GetType,它会隐藏它(在C#中它将用new关键字表示)。如果您使用反汇编工具(如ILSpy),您将看到它的实现方式如下:
public new Type GetType()
{
return base.GetType();
}
正如您所看到的,它只调用基类(对象)的GetType实现,因此最终结果是相同的。此版本的GetType为_Type接口提供了正式实现。您通常不必担心此接口,因为互操作性原因。
2
GetType方法在object中定义并返回System.Type。但仔细观察System.Type会发现它被定义为抽象,因此它永远无法实例化。因此,从GetType获取具体内容的方法是获取另一种类型,该类型派生自System.Type。实际上我们得到的是System.RuntimeType的一个实例,它派生自System.Type。
原因是必须只有一个实例代表给定的类型。也就是说,调用GetType的字符串有多少不同(例如),你仍然可以获得完全相同的实例,因为只有一个实例描述了一个字符串。为了确保只有一个实例,System.Type被定义为抽象,因此无法通过用户代码实例化,System.RuntimeType被定义为内部,因此只能访问mscorlib中的代码,并且无法通过用户代码实例化。
3
System.RuntimeType的存在是一个实现细节,在大多数情况下可能会被忽略。对于所有意图和目的,您的代码可以假定GetType返回System.Type的实例。 唯一的例外是使用以下代码(您可以将字符串替换为任何其他类型):
bool b =
typeof(string).GetType() == typeof(Type);
如果不知道System.RuntimeType,可以假设b为真,因为假设GetType返回System.Type,这显然是右手表达式的值。但由于左手值实际上是System.RuntimeType,因此b为false(System.Type和System.RuntimeType是两种不同的类型,因此不相等)。这是您需要了解System.RuntimeType以了解代码行为的原因的唯一情况。在任何其他情况下,GetType返回System.RuntimeType并不重要,您可以忽略它。
4
这是我的.NET在线课程中讨论运行时类型信息(RTTI)的直接链接。我没有提到System.RuntimeType,因为就像我说的那样,它实际上可以被忽略。但是这个链接将为您提供更多背景和更清楚地了解System.Type。
我希望这有帮助!
Motti
答案 1 :(得分:3)
Type类型实例是System.RuntimeType。
{
Console.WriteLine(typeof(System.Type).GetType());
Console.WriteLine(typeof(string).GetType().GetType());
Console.WriteLine(typeof(int).GetType());
Console.WriteLine(typeof(List<int>).GetType());
}
System.RuntimeType
System.RuntimeType
System.RuntimeType
System.RuntimeType
答案 2 :(得分:2)
看起来两者都没有。当您在GetType
个实例上致电Type
时,它似乎总是返回RuntimeType
。
我通过运行此代码片段对系统程序集进行了检查:
Assembly
.GetAssembly(typeof(int))
.GetTypes()
.Where(type => type.GetType() == type)
编辑:正如Luke在评论中澄清的那样,“原始类型”实际上只是给定RuntimeType
时的原始类型 - 它不适用于任何其他内容。由于该类型是系统内部的,因此该方法似乎完全错误。