Pregunta

Mi problema es que Typedescriptor no devuelva a los miembros de las interfaces heredadas, ¿es así como se supone que funciona? O se trata de un error ?

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

Solución

Este no es un error. Desde el Especificación de CLI de ECMA:

8.9.11 Derivación de tipo de interfaz

Los tipos de interfaz pueden requerir la implementación de una o más otras interfaces. Cualquier tipo que implementa soporte para un tipo de interfaz también implementará soporte para cualquier interfaces requeridas especificadas por esa interfaz. Esto es diferente de la herencia del tipo de objeto de dos maneras:

  • Los tipos de objetos forman un solo árbol de herencia; Los tipos de interfaz no lo hacen.
  • La herencia del tipo de objeto especifica cómo se heredan las implementaciones; Las interfaces requeridas no, ya que las interfaces no definen la implementación. Las interfaces requeridas especifican contratos adicionales que admitirá un tipo de objeto de implementación.

Para resaltar la última diferencia, considere una interfaz, IFoo, que tiene un solo método. Una interfaz, IBar, que deriva de él, requiere que cualquier tipo de objeto que admita IBar también apoyo IFoo. No dice nada sobre qué métodos IBar en sí mismo lo tendrá.

8.10 Herencia de miembros

Solo los tipos de objetos pueden heredar implementaciones, por lo tanto, solo los tipos de objetos pueden heredar miembros (ver §8.9.8). Si bien los tipos de interfaz pueden derivarse de otros tipos de interfaz, solo "heredan" el requisito de implementar contratos de método, nunca en los campos o implementaciones de métodos.

Editar...

Si desea obtener las propiedades de una interfaz, incluidas las de sus antepasados, entonces podría hacer algo como esto:

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

Otros consejos

Tienes razón. ¡Creo que es un error ya que funciona para propiedades hereditarias en las clases!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top