2013-08-09 6 views
6

これはインターフェイスと継承を実装することに関連していると確信しています。c#System.Type Typeはどのように名前プロパティを持っていますか

System.TypeクラスはどのようにプロパティNameを持っていますか?メタデータや、私が見るオブジェクトブラウザを使用してからTypeクラスのコードは、Typeクラスが持っていない場合は、私は例:

string Name 

どこでも定義されました。

私もその種類はのMemberInfoから継承し、(このような)_TypeとIReflectを実装して参照してください。

public abstract class Type : MemberInfo, _Type, IReflect 

基底クラスのMemberInfoプロパティを持っています

public abstract string Name { get; } 

私が知っているから、このは、抽象修飾子のために派生クラスでオーバーライドされるを持っています。

string Name { get; } 

、それはインターフェイスであるため、それはどちらか、自分自身の実装を持っていない:私はそこに財産がある_Typeインターフェイスに続いて...タイプで

をそれを見ることはありません。

名前は定義されていますが、System.Typeクラスにはどのように値がありますか?または、このクラスの継承とインプリメンテーションインターフェイスがどのように機能するかを理解していません。

答えて

10

System.Typeはそれ自体抽象クラスです。つまり、サブクラスでオーバーライドできます。

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

System.RuntimeTypeはあなたがドキュメントに表示されません内部タイプですが、それ:実際には、あなたは、実行時に型が、あなたがこのような何かを行う場合、実際にSystem.Type年代ではないことがわかりますNameプロパティを無効にします。それは少しのようになります。

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

official documentationにこのノートを参照してください:

タイプは、複数の実装を可能にする抽象基本クラスです。システムは常に派生クラスRuntimeTypeを提供します。リフレクションでは、ランタイムという単語で始まるすべてのクラスは、システム内のオブジェクトごとに1回だけ作成され、比較操作をサポートします。 MemberInfoから

1

抽象プロパティNameは確かSystem.Typeによって継承されます。

System.Typeがインターフェイスを実装できる理由は、抽象インスタンスメンバは、そのメンバが公開されている限り、インターフェイスを実装できることです。つまり、Nameです。インターフェイスを実装するメンバーは、基本クラスから継承できます。

System.TypeがないNameプロパティをオーバーライドに許可されている理由は、System.Type自体抽象クラスであるということです。したがって、抽象メンバを実装なしで「離れる」ことができます。それから派生する非抽象型は、このプロパティ(そのアクセッサーのget)の実装を提供しなければなりません。あなたは、変数Type t = ...;を持っており、それにt.Nameを呼び出すたび

実行時の型tは、いくつかの非抽象クラスである必要がありますし、そのクラスはNameの実装を持っています。