TypeDescriptor non restituisce membri dalle interfacce ereditate
-
26-09-2019 - |
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; }
}
}
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 supportiIBar
anche supportoIFoo
.Non dice nulla su quali metodiIBar
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!