typedEscriptorは、継承されたインターフェイスからメンバーを返しません
-
26-09-2019 - |
質問
私の問題は、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()));
他のヒント
あなたが正しいです。クラスの継承されたプロパティで機能するため、バグだと思います!
所属していません StackOverflow