Pergunta

Meu problema é que o TypeDescriptor não devolve membros de interfaces herdadas, é assim que deve estar funcionando? Ou seria um inseto ?

 [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; }
        }
    }
Foi útil?

Solução

Este não é um bug. De Especificação ECMA CLI:

8.9.11 Derivação do tipo de interface

Os tipos de interface podem exigir a implementação de uma ou mais outras interfaces. Qualquer tipo que implementa suporte para um tipo de interface também deve implementar o suporte para quaisquer interfaces necessárias especificadas por essa interface. Isso é diferente da herança do tipo de objeto de duas maneiras:

  • Os tipos de objetos formam uma única árvore de herança; Os tipos de interface não.
  • A herança do tipo de objeto especifica como as implementações são herdadas; As interfaces necessárias não, pois as interfaces não definem a implementação. As interfaces necessárias especificam contratos adicionais que um tipo de objeto implementador deve suportar.

Para destacar a última diferença, considere uma interface, IFoo, isso tem um único método. Uma interface, IBar, que deriva disso, está exigindo que qualquer tipo de objeto que suporta IBar também suporte IFoo. Não diz nada sobre quais métodos IBar por si só terá.

8.10 Herança do membro

Somente tipos de objeto podem herdar implementações, portanto, apenas os tipos de objetos podem herdar membros (consulte §8.9.8). Embora os tipos de interface possam ser derivados de outros tipos de interface, eles apenas "herdam" o requisito de implementar contratos de método, nunca campos ou implementações de método.

Editar...

Se você deseja obter as propriedades de uma interface, incluindo as de seus ancestrais, poderá fazer algo assim:

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

Outras dicas

Você está certo. Eu acho que é um bug, pois funciona para propriedades herdadas nas aulas!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top