Was ist der schnellste Weg, um festzustellen, ob eine Eigenschaft in einer Klasse mit Attributen ein bestimmtes Attribut enthält? Beispielsweise:
[IsNotNullable]
[IsPK]
[IsIdentity]
[SequenceNameAttribute("Id")]
public Int32 Id
{
get
{
return _Id;
}
set
{
_Id = value;
}
}
Was ist die schnellste Methode, um festzustellen, ob beispielsweise das Attribut "IsIdentity" vorhanden ist?
c#
performance
Otávio Décio
quelle
quelle
Attribute.IsDefined
eine Codezeile und die hässlichen Arrays / Castings entfernt.[NotMapped]
in der Klasse verwendet, aber um es zu erkennen, müssen Sie verwendenAttribute.IsDefined(pi, typeof(NotMappedAttribute))
IsIdentity[] attr = pi.GetCustomAttributes<IsIdentity>(false);
Wenn Sie .NET 3.5 verwenden, können Sie es mit Ausdrucksbäumen versuchen. Es ist sicherer als Nachdenken:
quelle
Sie können eine allgemeine Methode verwenden, um Attribute über eine bestimmte MemberInfo zu lesen
quelle
Um die Antwort von @Hans Passant zu aktualisieren und / oder zu verbessern, würde ich das Abrufen der Eigenschaft in eine Erweiterungsmethode aufteilen. Dies hat den zusätzlichen Vorteil, dass die böse magische Zeichenfolge in der Methode GetProperty () entfernt wird.
Ihr Test wird dann auf zwei Zeilen reduziert
quelle
Wenn Sie versuchen, dies in einer PCL für tragbare Klassenbibliotheken (wie ich) zu tun, können Sie dies folgendermaßen tun :)
Sie können dann bei Bedarf die Anzahl der Eigenschaften überprüfen, die über diese spezielle Eigenschaft verfügen.
quelle
Dies kann jetzt ohne Ausdrucksbäume und Erweiterungsmethoden typsicher mit der neuen C # -Funktion
nameof()
wie folgt durchgeführt werden:nameof () wurde in C # 6 eingeführt
quelle
Sie können die Attribute.IsDefined-Methode verwenden
https://msdn.microsoft.com/en-us/library/system.attribute.isdefined(v=vs.110).aspx
Sie können die Eigenschaft bereitstellen, nach der Sie speziell suchen, oder Sie können alle mithilfe von Reflexion durchlaufen, z. B.:
quelle
Dies ist eine ziemlich alte Frage, die ich aber verwendet habe
Meine Methode hat diesen Parameter, aber er könnte erstellt werden:
Dann in der Methode dies:
quelle