Ich habe einen Typ, t
und möchte eine Liste der öffentlichen Eigenschaften erhalten, die das Attribut haben MyAttribute
. Das Attribut ist AllowMultiple = false
wie folgt gekennzeichnet :
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
Momentan habe ich Folgendes, aber ich denke, es gibt einen besseren Weg:
foreach (PropertyInfo prop in t.GetProperties())
{
object[] attributes = prop.GetCustomAttributes(typeof(MyAttribute), true);
if (attributes.Length == 1)
{
//Property with my custom attribute
}
}
Wie kann ich das verbessern? Ich entschuldige mich, wenn dies ein Duplikat ist, gibt es da draußen eine Menge Reflexionsfäden ... scheint ein ziemlich heißes Thema zu sein.
c#
.net
reflection
wsanville
quelle
quelle
Antworten:
Dadurch wird vermieden, dass Attributinstanzen materialisiert werden müssen (dh es ist billiger als
GetCustomAttribute[s]()
.quelle
get
wird auch bei Verwendung nicht aufgerufenGetCustomAttributes
; Das Attribut wird jedoch instanziiert , was nicht frei ist. Wenn Sie bestimmte Werte des Attributs nicht überprüfen müssen,IsDefined
ist dies billiger. Und in 4.5 gibt es Möglichkeiten, die Instanziierungsdaten zu überprüfen, ohne tatsächlich Attributinstanzen zu erstellen (obwohl dies nur für sehr spezifische Szenarien vorgesehen ist)Die Lösung, die ich am häufigsten verwende, basiert auf der Antwort von Tomas Petricek. Normalerweise möchte ich sowohl mit dem Attribut als auch mit der Eigenschaft etwas tun .
quelle
Soweit ich weiß, gibt es keinen besseren Weg, um mit der Reflection-Bibliothek intelligenter zu arbeiten. Sie können jedoch LINQ verwenden, um den Code ein bisschen schöner zu machen:
Ich glaube, dies hilft Ihnen, den Code besser lesbar zu strukturieren.
quelle
Es gibt immer LINQ:
quelle
Wenn Sie sich regelmäßig mit Attributen in Reflection beschäftigen, ist es sehr, sehr praktisch, einige Erweiterungsmethoden zu definieren. Sie werden das in vielen Projekten sehen. Dieser hier ist einer, den ich oft habe:
die du gerne benutzen kannst
typeof(Foo).HasAttribute<BarAttribute>();
Andere Projekte (z. B. StructureMap) verfügen über vollwertige ReflectionHelper-Klassen, die Ausdrucksbäume verwenden, um eine feine Syntax für die Identität zu erhalten, z. B. PropertyInfos. Die Verwendung sieht dann so aus:
quelle
Zusätzlich zu den vorherigen Antworten: Es ist besser, die Methode zu verwenden,
Any()
anstatt die Länge der Sammlung zu überprüfen:Das Beispiel bei dotnetfiddle: https://dotnetfiddle.net/96mKep
quelle
.Any()
die Länge sicher nicht überprüft. Bei meiner Antwort ging es jedoch nicht um gefundene Eigenschaften mit genau einem Attribut. Zweitens bin ich mir nicht sicher, ob Sie den Code richtig gelesen haben -.Any
Methode, die für das Ergebnis der Methode aufgerufenGetCustomAttrubutes
wird. Der Typ despropertiesWithMyAttribute
wird also die Sammlung der Eigenschaften sein. Schauen Sie sich das Beispiel bei dotnetfiddle an (ich füge den Link zur Antwort hinzu).