typedEscriptorは、継承されたインターフェイスからメンバーを返しません

StackOverflow https://stackoverflow.com/questions/4031267

質問

私の問題は、Typedescriptorが継承されたインターフェイスからメンバーを返さないということです。これは、どのように機能しているかですか?それともバグですか?

 [TestFixture]
    public class DescriptorTests
    {
        [Test]
        public void Test()
        {
                                                                    // count = 1 
            Assert.AreEqual(2, TypeDescriptor.GetProperties(typeof(IFoo)).Count);
     // it is going to fail, the Id is not going to be returned
        }

        public interface IEntity
        {
            int Id { get; set; }
        }

        public interface IFoo : IEntity
        {
            string Name { get; set; }
        }
    }
役に立ちましたか?

解決

これはバグではありません。から ECMA CLI仕様:

8.9.11インターフェイスタイプの派生

インターフェイスタイプでは、1つ以上の他のインターフェイスを実装する必要があります。インターフェイスタイプのサポートを実装する任意のタイプは、そのインターフェイスによって指定された必要なインターフェイスのサポートも実装するものとします。これは、2つの方法でオブジェクトタイプの継承とは異なります。

  • オブジェクトタイプは、単一の継承ツリーを形成します。インターフェイスタイプはありません。
  • オブジェクトタイプの継承は、実装の継承方法を指定します。インターフェイスは実装を定義しないため、必要なインターフェイスはそうではありません。必要なインターフェイスは、実装オブジェクトタイプがサポートする追加の契約を指定します。

最後の違いを強調するには、インターフェイスを検討してください。 IFoo, 、それには単一の方法があります。インターフェイス、 IBar, 、それに由来する、サポートするオブジェクトタイプが必要です IBar サポートもあります IFoo。どの方法について何も言っていません IBar それ自体が持っています。

8.10メンバーの相続

オブジェクトタイプのみが実装を継承できるため、オブジェクトタイプのみがメンバーを継承できます(§8.9.8を参照)。インターフェイスタイプは他のインターフェイスタイプから導出できますが、メソッド契約を実装する要件を「継承」するだけでなく、フィールドやメソッドの実装はありません。

編集...

祖先のプロパティを含むインターフェイスのプロパティを取得したい場合は、次のようなことをすることができます。

var properties = typeof(IFoo)
                     .GetProperties()
                     .Union(typeof(IFoo)
                                .GetInterfaces()
                                .SelectMany(t => t.GetProperties()));

他のヒント

あなたが正しいです。クラスの継承されたプロパティで機能するため、バグだと思います!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top