C #: O que é a diferença entre TypeDescriptor.GetAttributes () e GetType .GetCustomAttributes ()?
-
11-09-2019 - |
Pergunta
Tome essas duas coisas de código:
instance.GetType()
.GetCustomAttributes(true)
.Where(item => item is ValidationAttribute);
E
TypeDescriptor.GetAttributes(instance)
.OfType<ValidationAttribute>();
Se a aparência de classe como:
[RequiredIfOtherPropertyIsNotEmpty("State", "City", ErrorMessage = ErrorDescription.CreateAccount_CityRequiredWithState)]
[RequiredIfOtherPropertyIsNotEmpty("State", "Address1", ErrorMessage = ErrorDescription.CreateAccount_Address1RequiredWithState)]
public class ManagePostModel
{
...
}
Onde RequiredIfOtherPropertyIsNotEmpty
é um ValidationAttribute
e tem AllowMultiple = true
.
O primeiro retorna um dois atributos, o segundo retorna um.
Qual é a diferença que faria isso?
Solução
A partir página MSDN sobre TypeDescriptor.GetAttributes :
Para retornar várias instâncias de um atributo
AttributeUsageAttribute.AllowMultiple
doAttributeCollection
, seu atributo deve substituir a propriedadeAttribute.TypeId
.
Para responder à pergunta geral "o que é a diferença?": Os valores retornados por TypeDescriptor
pode ser estendido em tempo de execução, enquanto que aqueles em Type
não pode. A página MSDN I ligada à explica mais.
Se você não precisa deste tipo de extensão de tempo de execução, ea maneira alças TypeDescriptor
vários atributos é um problema, você é provavelmente melhor fora com Type.GetCustomAttributes
.