6

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

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

string Name

在任何地方定义。

我还看到 Type 继承自 MemberInfo 并实现 _Type 和 IReflect (像这样):

public abstract class Type : MemberInfo, _Type, IReflect

基类 MemberInfo 具有以下属性:

public abstract string Name { get; }

据我所知,由于抽象修饰符,这必须在派生类中被覆盖。我在类型中没有看到它...

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

string Name { get; }

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

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

4

2 回答 2

10

请注意,System.Type它本身就是一个抽象类。这意味着它可以在子类中被覆盖。实际上,System.Type如果您执行以下操作,您可以看到运行时的类型实际上不是 's:

typeof(Type).GetType().FullName; // System.RuntimeType

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

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

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

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

于 2013-08-09T19:13:32.033 回答
1

的抽象属性确实由Name继承。MemberInfoSystem.Type

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

之所以System.Type允许覆盖该Name属性,是因为System.Type它本身就是一个抽象类。所以它可以“离开”没有实现的抽象成员。派生自它的非抽象类型仍必须提供此属性(其get访问器)的实现。

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

于 2013-08-09T20:25:53.490 回答