Question

mon problème est que TypeDescriptor ne retourne pas les membres d'interfaces héritées, est-ce la façon dont il est censé travailler? ou est-ce un 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; }
        }
    }
Était-ce utile?

La solution

Ce n'est pas un bug. De la ECMA CLI spécification :

  

08/09/11 Type d'interface dérivation

     

types d'interface peut exiger la   la mise en œuvre d'un ou plusieurs autres   interfaces. Tout type qui implémente   soutien à un type d'interface doit   mettre en œuvre également un soutien pour tout   interfaces requises spécifiées par ce   interface. Ceci est différent de   héritage type d'objet de deux façons:

     
      
  • types d'objets forment un seul arbre d'héritage; types d'interface font   pas.
  •   
  • héritage type objet indique comment les implémentations sont héritées;   les interfaces requises ne sont pas, depuis   interfaces ne définissent pas   la mise en oeuvre. interfaces requises   préciser contrats supplémentaires qu'un   la mise en œuvre type d'objet doit   soutien.
  •   
     

Pour mettre en évidence la dernière différence,   envisager une interface, IFoo, que   a une seule méthode. Une interface,   IBar, qui en découle, est   exiger que tout type d'objet   supports IBar également IFoo de soutien.   Il ne dit rien au sujet qui   méthodes IBar lui-même aura.

     

8.10 héritage membres

     

Seuls les types d'objets peuvent hériter   mises en œuvre, d'où seul objet   types peuvent hériter membres (voir   §8.9.8). Bien que les types d'interface peuvent être   dérivés d'autres types d'interface,   ils ne « inherit » l'obligation de   mettre en œuvre des contrats de méthode, jamais   des champs ou des mises en oeuvre la méthode.

Modifier ...

Si vous voulez obtenir les propriétés d'une interface, y compris ceux de ses ancêtres, alors vous pourriez faire quelque chose comme ceci:

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

Autres conseils

Vous avez raison. Je pense qu'il est un bug car il fonctionne pour les propriétés héritées sur les classes!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top