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

时间:2013-08-09 19:09:16

标签: c# inheritance interface abstract

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

在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; }

据我所知,由于abstract修饰符,这个在派生类中被覆盖。我没有在Type ...中看到它。

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

string Name { get; }

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

在哪里定义Name以及它如何在System.Type类中有值?或者我不明白继承和实现接口如何适用于此类

2 个答案:

答案 0 :(得分:10)

请注意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 { ... }
        }
    }
}

请参阅official documentation

中的此说明
  

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

答案 1 :(得分:1)

来自Name的抽象属性MemberInfo确实由System.Type继承。

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

System.Type允许覆盖Name属性的原因是System.Type本身就是一个抽象类。所以它可以“留下”抽象成员而不实现。从中派生的非抽象类型仍必须为此属性(其get访问者)提供实现。

如果您有变量Type t = ...;并在其上调用t.Name,则t 运行时类型 将具有成为一些非抽象类,该类将具有Name的实现。