Biorąc pod uwagę właściwość w klasie z atrybutami - jaki jest najszybszy sposób określenia, czy zawiera ona dany atrybut? Na przykład:
[IsNotNullable]
[IsPK]
[IsIdentity]
[SequenceNameAttribute("Id")]
public Int32 Id
{
get
{
return _Id;
}
set
{
_Id = value;
}
}
Jaka jest najszybsza metoda ustalenia, na przykład, że ma atrybut „IsIdentity”?
c#
performance
Otávio Décio
źródło
źródło
Attribute.IsDefined
wyeliminuje jedną linię kodu i brzydkie tablice / rzutowanie.[NotMapped]
w klasie, ale aby go wykryć, musisz użyćAttribute.IsDefined(pi, typeof(NotMappedAttribute))
IsIdentity[] attr = pi.GetCustomAttributes<IsIdentity>(false);
Jeśli używasz .NET 3.5, możesz spróbować z drzewami wyrażeń. To jest bezpieczniejsze niż refleksja:
źródło
Możesz użyć wspólnej (ogólnej) metody do odczytu atrybutu z danego elementu MemberInfo
źródło
Aby zaktualizować i / lub ulepszyć odpowiedź przez @Hans Passant, oddzieliłbym pobieranie własności na metodę rozszerzenia. Ma to dodatkową zaletę w postaci usunięcia nieprzyjemnego magicznego ciągu w metodzie GetProperty ()
Twój test jest następnie zredukowany do dwóch linii
źródło
Jeśli próbujesz to zrobić w przenośnej bibliotece klas PCL (tak jak ja), oto jak możesz to zrobić :)
W razie potrzeby możesz następnie sprawdzić liczbę nieruchomości, które mają tę specjalną właściwość.
źródło
Można to teraz zrobić bez drzew wyrażeń i metod rozszerzających w bezpieczny sposób dzięki nowej funkcji języka C #,
nameof()
takiej jak ta:nameof () została wprowadzona w C # 6
źródło
Możesz użyć metody Attribute.IsDefined
https://msdn.microsoft.com/en-us/library/system.attribute.isdefined(v=vs.110).aspx
Możesz podać właściwość, której konkretnie szukasz, lub możesz iterować je wszystkie za pomocą odbicia, na przykład:
źródło
To dość stare pytanie, ale użyłem
Moja metoda ma ten parametr, ale można ją zbudować:
Następnie w metodzie to:
źródło