C #: в чем разница между TypeDescriptor.GetAttributes () и GetType () .GetCustomAttributes? - PullRequest
13 голосов
/ 02 декабря 2009

Возьмите эти две вещи кода:

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

И

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

Если класс выглядит так:

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

Где RequiredIfOtherPropertyIsNotEmpty является ValidationAttribute и имеет AllowMultiple = true.

Первый возвращает два атрибута, второй возвращает один.

Какая разница, что может вызвать это?

1 Ответ

10 голосов
/ 02 декабря 2009

С страница MSDN на TypeDescriptor.GetAttributes :

Чтобы вернуть несколько экземпляров атрибута AttributeUsageAttribute.AllowMultiple из AttributeCollection, ваш атрибут должен переопределить свойство Attribute.TypeId.

Чтобы ответить на общий вопрос «в чем разница?»: Значения, возвращаемые TypeDescriptor, могут быть расширены во время выполнения, тогда как значения в Type не могут. Страница MSDN, на которую я ссылаюсь, объясняет больше.

Если вам не нужны такие расширения времени выполнения, а способ, которым TypeDescriptor обрабатывает несколько атрибутов, является проблемой, вам, вероятно, лучше использовать Type.GetCustomAttributes.

...