首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeDescriptor不从继承的接口返回成员

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

Stack Overflow用户
提问于 2010-10-27 16:35:28
回答 2查看 1.1K关注 0票数 4

我的问题是TypeDescriptor没有从继承的接口返回成员,这是它应该工作的方式吗?还是说这是个bug?

代码语言:javascript
复制
 [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; }
        }
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-27 17:47:24

这不是一个bug。从ECMA CLI specification

8.9.11接口类型派生

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

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

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

8.10成员继承

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

编辑...

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

代码语言:javascript
复制
var properties = typeof(IFoo)
                     .GetProperties()
                     .Union(typeof(IFoo)
                                .GetInterfaces()
                                .SelectMany(t => t.GetProperties()));
票数 11
EN

Stack Overflow用户

发布于 2010-10-27 16:43:10

你是正确的。我认为这是一个bug,因为它适用于类的继承属性!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4031267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档