4

我的问题是 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; }
        }
    }
4

2 回答 2

11

这不是错误。来自ECMA CLI 规范

8.9.11 接口类型推导

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

  • 对象类型形成一个单一的继承树;接口类型没有。
  • 对象类型继承指定如何继承实现;required 接口没有,因为接口没有定义实现。所需接口指定实现对象类型应支持的附加契约。

为了突出最后一个区别,考虑一个接口,IFoo,它只有一个方法。IBar派生自它的接口 要求任何支持的对象类型IBar也支持IFoo。它没有说明任何方法IBar本身将具有哪些内容。

8.10 成员继承

只有对象类型可以继承实现,因此只有对象类型可以继承成员(参见 §8.9.8)。虽然接口类型可以从其他接口类型派生,但它们仅“继承”实现方法协定的要求,而不是字段或方法实现。

编辑...

如果您想获取接口的属性,包括其祖先的属性,那么您可以执行以下操作:

var properties = typeof(IFoo)
                     .GetProperties()
                     .Union(typeof(IFoo)
                                .GetInterfaces()
                                .SelectMany(t => t.GetProperties()));
于 2010-10-27T09:47:23.943 回答
1

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

于 2010-10-27T08:43:10.207 回答