Domanda

il mio problema è che TypeDescriptor non restituisce membri da interfacce ereditate, è così che dovrebbe funzionare?o è 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; }
        }
    }
È stato utile?

Soluzione

Questo non è un bug.Dal Specifica CLI ECMA:

8.9.11 Derivazione del tipo di interfaccia

I tipi di interfaccia possono richiedere l'implementazione di una o più altre interfacce.Qualsiasi tipo che implementa il supporto per un tipo di interfaccia deve anche implementare il supporto per qualsiasi interfaccia richiesta specificata da tale interfaccia.Questo è diverso dall'eredità del tipo di oggetto in due modi:

  • I tipi di oggetto formano un singolo albero di ereditarietà;I tipi di interfaccia no.
  • L'ereditarietà del tipo di oggetto specifica come vengono ereditate le implementazioni;Le interfacce richieste non lo fanno, poiché le interfacce non definiscono l'implementazione.Interfacce richieste Specificare contratti aggiuntivi che un tipo di oggetto di attuazione deve supportare.

Per evidenziare l'ultima differenza, considera un'interfaccia, IFoo, questo ha un singolo metodo.Un'interfaccia, IBar, che ne deriva da esso richiede che qualsiasi tipo di oggetto che supporti IBar anche supporto IFoo.Non dice nulla su quali metodi IBar stessa avrà.

8.10 Eredità dei soci

Solo i tipi di oggetti possono ereditare le implementazioni, quindi solo i tipi di oggetti possono ereditare i membri (vedere §8.9.8).Mentre i tipi di interfaccia possono essere derivati ​​da altri tipi di interfaccia, "ereditano" solo il requisito per implementare contratti di metodi, mai campi o implementazioni di metodi.

Modificare...

Se vuoi ottenere le proprietà di un'interfaccia, comprese quelle dei suoi antenati, allora potresti fare qualcosa del genere:

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

Altri suggerimenti

Hai ragione. Penso che sia un bug poiché funziona per le proprietà ereditarie sulle lezioni!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top