2009-12-02 14 views
12

Quitad esto de dos códigos:C#: ¿Cuál es la diferencia entre TypeDescriptor.GetAttributes() y GetType() .GetCustomAttributes?

instance.GetType() 
.GetCustomAttributes(true) 
.Where(item => item is ValidationAttribute); 

Y

TypeDescriptor.GetAttributes(instance) 
.OfType<ValidationAttribute>(); 

Si la clase parece:

[RequiredIfOtherPropertyIsNotEmpty("State", "City", ErrorMessage = ErrorDescription.CreateAccount_CityRequiredWithState)] 
[RequiredIfOtherPropertyIsNotEmpty("State", "Address1", ErrorMessage = ErrorDescription.CreateAccount_Address1RequiredWithState)] 
public class ManagePostModel 
{ 
    ... 
} 

Dónde RequiredIfOtherPropertyIsNotEmpty es un ValidationAttribute y tiene AllowMultiple = true.

El primero arroja dos atributos, el segundo devuelve uno.

¿Cuál es la diferencia que causaría esto?

+0

Ver también [typedescriptor-getproperties-vs-type-getproperties] (http://stackoverflow.com/questions/1402239/typedescriptor-getproperties-vs-type-getproperties) – nawfal

Respuesta

9

De the MSDN page on TypeDescriptor.GetAttributes:

Con el fin de volver varias instancias de un atributo de la AttributeUsageAttribute.AllowMultipleAttributeCollection, el atributo debe reemplazar la propiedad Attribute.TypeId.

Para responder a la pregunta general "¿cuál es la diferencia?": Los valores devueltos por TypeDescriptor se pueden extender en tiempo de ejecución, mientras que los de Type no puede. La página de MSDN a la que he vinculado explica más.

Si no necesita este tipo de extensión de tiempo de ejecución, y la forma en que TypeDescriptor maneja múltiples atributos es un problema, probablemente esté mejor con Type.GetCustomAttributes.

+1

Así que Type.GetCustomAttributes no puede obtener los atributos que se agregan en tiempo de ejecución (me refiero a los atributos agregados mediante el uso de TypeDescriptor.AddAttributes (...)) ¿verdad? – Gintama

+0

'TypeDescriptor.GetAttributes (...)' no está disponible para al menos 'netstandard1.3' y' netstandard1.4' – manuc66

Cuestiones relacionadas