我的问题是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接口类型派生

接口类型可能需要实现一个或多个其他接口。任何实现接口类型的支持的类型也应对该接口指定的任何必需接口实施支持。这与对象类型的继承不同:

  • 对象类型形成单个继承树;接口类型没有。
  • 对象类型继承指定实施方式的继承方式;所需的接口不会,因为接口未定义实现。所需的接口指定实现对象类型应支持的其他合同。

要突出显示最后区别,请考虑一个接口, IFoo, ,这有一个方法。接口, IBar, 从中衍生的,要求任何支持的对象类型 IBar 也支持 IFoo。它没有说任何方法 IBar 本身会有。

8.10成员继承

只有对象类型可以继承实现,因此只有对象类型可以继承成员(请参阅第§8.9.8)。虽然可以从其他接口类型派生接口类型,但它们仅“继承”实现方法合同,NEVER FIELD或方法实现的要求。

编辑...

如果您想获得界面的属性,包括其祖先的界面,那么您可以做这样的事情:

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

其他提示

你说的对。我认为这是一个错误,因为它适用于课堂上的继承属性!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top