Angenommen, die folgende hypothetische Vererbungshierarchie:
public interface IA
{
int ID { get; set; }
}
public interface IB : IA
{
string Name { get; set; }
}
Reflektion verwenden und folgenden Anruf tätigen:
typeof(IB).GetProperties(BindingFlags.Public | BindingFlags.Instance)
gibt nur die Eigenschaften der Schnittstelle aus IB
, die " Name
" ist.
Wenn wir einen ähnlichen Test mit dem folgenden Code durchführen würden,
public abstract class A
{
public int ID { get; set; }
}
public class B : A
{
public string Name { get; set; }
}
Der Aufruf typeof(B).GetProperties(BindingFlags.Public | BindingFlags.Instance)
gibt ein Array von PropertyInfo
Objekten für " ID
" und " Name
" zurück.
Gibt es eine einfache Möglichkeit, alle Eigenschaften in der Vererbungshierarchie für Schnittstellen wie im ersten Beispiel zu finden?
quelle
Stack<Type>
anstelle von a implementiertQueue<>
. Mit einem Stapel behält die Abstammung eine Reihenfolge bei, in derinterface IFoo : IBar, IBaz
woIBar : IBubble
und 'IBaz: IFlubber, the order of reflection becomes:
IBar,
IBubble,
IBaz,
IFlubber,
IFoo'.GetProperties
. Sie verwendenGetInterfaces
für Ihren Starttyp, der die abgeflachte Liste aller Schnittstellen zurückgibt und dies einfachGetProperties
für jede Schnittstelle tut . Keine Rekursion erforderlich. Es gibt keine Vererbung oder Basistypen in Schnittstellen.Type.GetInterfaces
Gibt die abgeflachte Hierarchie zurück, sodass kein rekursiver Abstieg erforderlich ist.Die gesamte Methode kann mit LINQ viel präziser geschrieben werden:
quelle
GetValue
die abgerufenePropertyInfo
Instanz auf und übergeben Sie Ihre Instanz (deren Eigenschaftswert abgerufen werden soll) als Parameter. Beispiel:var list = new[] { 'a', 'b', 'c' }; var count = typeof(IList).GetPublicProperties().First(i => i.Name == "Count").GetValue(list);
← gibt 3 zurück, obwohl diesCount
in definiert istICollection
, nichtIList
.GetInterfaces
ist nicht erforderlich, wenntype
es sich um eine Klasse handelt, da die konkrete Klasse alle Eigenschaften implementieren MUSS , die in allen Schnittstellen entlang der Vererbungskette definiert sind. Die Verwendung in diesem Szenario würde dazu führen, dass ALLE Eigenschaften dupliziert werden.GetInterfaces
Schnittstellenhierarchien sind ein Schmerz - sie "erben" nicht wirklich als solche, da Sie mehrere "Eltern" haben können (aus Mangel an einem besseren Begriff).
"Abflachen" (wieder nicht ganz der richtige Begriff) Die Hierarchie könnte das Überprüfen aller von der Schnittstelle implementierten Schnittstellen und das Arbeiten von dort aus beinhalten ...
quelle
Genau das gleiche Problem hat eine hier beschriebene Problemumgehung .
FlattenHierarchy funktioniert übrigens nicht. (nur auf statischen vars. sagt so in Intellisense)
Problemumgehung. Vorsicht vor Duplikaten.
quelle
Als Antwort auf @douglas und @ user3524983 sollte Folgendes die Frage des OP beantworten:
oder für eine einzelne Immobilie:
OK, das nächste Mal werde ich es vor dem Posten debuggen anstatt nach :-)
quelle
Dies funktionierte gut und knapp für mich in einem benutzerdefinierten MVC-Modellordner. Sollte jedoch in der Lage sein, auf jedes Reflexionsszenario zu extrapolieren. Immer noch stinkt es irgendwie, dass es zu pass ist
quelle