Dada una propiedad en una clase, con atributos, ¿cuál es la forma más rápida de determinar si contiene un atributo dado? Por ejemplo:
[IsNotNullable]
[IsPK]
[IsIdentity]
[SequenceNameAttribute("Id")]
public Int32 Id
{
get
{
return _Id;
}
set
{
_Id = value;
}
}
¿Cuál es el método más rápido para determinar que, por ejemplo, tiene el atributo "IsIdentity"?
c#
performance
Otávio Décio
fuente
fuente
Attribute.IsDefined
eliminará una línea de código y las matrices / transmisiones feas.[NotMapped]
en la clase, pero para detectarlo debe usarloAttribute.IsDefined(pi, typeof(NotMappedAttribute))
IsIdentity[] attr = pi.GetCustomAttributes<IsIdentity>(false);
Si está utilizando .NET 3.5, puede probar con árboles de expresión. Es más seguro que la reflexión:
fuente
Puede usar un método común (genérico) para leer el atributo sobre una información de miembro dada
fuente
Para actualizar y / o mejorar la respuesta de @Hans Passant, separaría la recuperación de la propiedad en un método de extensión. Esto tiene el beneficio adicional de eliminar la cadena mágica desagradable en el método GetProperty ()
Su prueba se reduce a dos líneas.
fuente
Si está tratando de hacer eso en una PCL de la Biblioteca de clases portátil (como yo), así es como puede hacerlo :)
Luego puede verificar la cantidad de propiedades que tienen esta propiedad especial si es necesario.
fuente
Esto ahora se puede hacer sin árboles de expresión y métodos de extensión de manera segura con la nueva característica C #
nameof()
como esta:nameof () se introdujo en C # 6
fuente
Puede usar el método Attribute.IsDefined
https://msdn.microsoft.com/en-us/library/system.attribute.isdefined(v=vs.110).aspx
Puede proporcionar la propiedad que está buscando específicamente o puede recorrerlos todos mediante la reflexión, algo así como:
fuente
Esta es una pregunta bastante antigua pero solía
Mi método tiene este parámetro pero podría construirse:
Entonces en el método esto:
fuente