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

时间:2010-10-27 08:35:28

标签: c# .net 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; }
        }
    }

2 个答案:

答案 0 :(得分:9)

这不是错误。来自ECMA CLI specification

  

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()));

答案 1 :(得分:1)

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