2013-08-09 2 views
6

Я уверен, что это связано с реализацией интерфейсов и наследованием.Как C# Тип System.Type имеет свойство name

В C#, как класс System.Type имеет свойство Name? Когда я пример кода класса типа из метаданных или с помощью Object Browser, я вижу, класс Тип не имеет:

string Name 

определено в любом месте.

Я также вижу, что тип наследует от MemberInfo и реализует _Type и IReflect (как это):

public abstract class Type : MemberInfo, _Type, IReflect 

Базовый класс MemberInfo обладает свойством:

public abstract string Name { get; } 

Из того, что я знаю, это имеет для переопределения в производном классе из-за абстрактного модификатора. Я не вижу его в тип ...

Затем в интерфейсе _Type есть свойство:

string Name { get; } 

и потому, что в интерфейсе не имеет реализации своих собственных либо.

Где определено определение имени и как оно имеет значение в классе System.Type? Или я не понимаю, как работает наследование и реализующие интерфейсы для этого класса

ответ

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 { ... } 
     } 
    } 
} 

Смотрите эту ноту в official documentation:

Тип является абстрактным базовым классом, который позволяет использовать несколько реализаций. Система всегда будет предоставлять производный класс RuntimeType. В отражении все классы, начинающиеся со слова Runtime, создаются только один раз для каждого объекта в системе и поддерживают операции сравнения.

1

Абстрактное свойство Name от MemberInfo действительно наследуется System.Type.

Причина, по которой System.Type может реализовать интерфейс, заключается в том, что субъекту абстрактного экземпляра разрешено реализовывать интерфейс, если этот член является общедоступным, конечно, который Name есть. Члены, реализующие интерфейсы, могут быть унаследованы от базовых классов.

Причина, почему System.Type разрешено не переопределить Name свойства, что System.Type сам по себе является абстрактным классом. Таким образом, он может «оставить» абстрактного участника без реализации. Не абстрактные типы, вытекающие из него, все равно должны дать реализацию для этого свойства (его аксессуар get).

Всякий раз, когда у вас есть переменная Type t = ...; и вызвать t.Name на этом, времени выполнения типа из t должны быть некоторые не абстрактный класс, и этот класс будет иметь реализацию Name.

Смежные вопросы