TypeDescriptor ne revient pas membres d'interfaces héritées
-
26-09-2019 - |
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; }
}
}
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 supportsIBar
égalementIFoo
de soutien. Il ne dit rien au sujet qui méthodesIBar
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!