TypeDescriptor不会从继承的接口返回成员

Omu*_*Omu 4 .net c# reflection typedescriptor

我的问题是TypeDescriptor不会从继承的接口返回成员,这是应该如何工作的?还是一个bug?

 [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; }
        }
    }
Run Code Online (Sandbox Code Playgroud)

Luk*_*keH 10

这不是一个错误.从ECMA CLI规范:

8.9.11接口类型派生

接口类型可能需要实现一个或多个其他接口.任何实现对接口类型的支持的类型还应实现对该接口指定的任何所需接口的支持.这与对象类型继承有两种不同:

  • 对象类型形成单个继承树; 接口类型没有.
  • 对象类型继承指定如何继承实现; 必需的接口没有,因为接口没有定义实现.必需的接口指定实现对象类型应支持的其他合同.

要突出显示最后的差异,请考虑IFoo具有单个方法的接口.IBar从中派生的接口 要求任何支持的对象类型IBar也支持IFoo.它没有说明IBar自己将拥有哪些方法.

8.10成员继承

只有对象类型可以继承实现,因此只有对象类型才能继承成员(参见§8.9.8).虽然接口类型可以从其他接口类型派生,但它们只"继承"实现方法契约的要求,而不是字段或方法实现.

编辑...

如果你想获得接口的属性,包括它的祖先的属性,那么你可以做这样的事情:

var properties = typeof(IFoo)
                     .GetProperties()
                     .Union(typeof(IFoo)
                                .GetInterfaces()
                                .SelectMany(t => t.GetProperties()));
Run Code Online (Sandbox Code Playgroud)