c#System.Type类型如何具有name属性

本文关键字:name 属性 何具 Type 类型 c#System | 更新日期: 2023-09-27 18:27:09

我确信这与实现接口和继承有关。

在c#中,System.Type类如何具有属性Name?当我从元数据或使用对象浏览器举例说明Type类的代码时,我看到Type类没有:

string Name

定义在任何地方。

我还看到Type继承了MemberInfo并实现了_Type和IReflect(如下):

public abstract class Type : MemberInfo, _Type, IReflect

基类MemberInfo具有属性:

public abstract string Name { get; }

据我所知,由于使用了抽象修饰符,这个必须在派生类中重写。我在Type中看不到它。。。

然后在_Type接口中有一个属性:

string Name { get; }

因为它是在一个接口中,所以它也没有自己的实现。

Name在哪里定义,它如何在System.Type类中具有值?或者我不理解这个类的继承和实现接口是如何工作的

c#System.Type类型如何具有name属性

请注意,System.Type本身就是一个抽象类。这意味着它可以在子类中被覆盖。事实上,如果您这样做,您可以看到运行时的类型实际上并不是System.Type的:
typeof(Type).GetType().FullName; // System.RuntimeType

System.RuntimeType是文档中看不到的内部类型,但它确实覆盖了Name属性。它看起来有点像这样:

namespace System
{
    internal class RuntimeType : Type, ISerializable, ICloneable
    {
        ...
        public override string Name
        {
            get { ... }
        }
    }
}

请参阅官方文件中的此注释:

Type是一个允许多个实现的抽象基类。系统将始终提供派生类RuntimeType。在反射中,所有以单词Runtime开头的类在系统中每个对象只创建一次,并支持比较操作。

MemberInfo的抽象属性Name实际上是由System.Type继承的。

System.Type之所以能够实现接口,是因为抽象实例成员可以实现接口,只要该成员是公共的,当然Name也是。实现接口的成员可以从基类继承。

System.Type被允许而不是重写Name属性的原因是System.Type本身就是一个抽象类。因此,它可以"离开"抽象成员而不执行。从它派生的非抽象类型仍然必须为此属性(其get访问器)提供实现。

每当您有一个变量Type t = ...;并对其调用t.Name时,t运行时类型必须是某个非抽象类,并且该类将具有Name的实现。