C#:TypeDescriptor.GetAttributes()和GetType()。GetCustomAttributes有什么区别?

时间:2009-12-02 14:37:53

标签: c# attributes typedescriptor

采取以下两个代码:

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
{
   ...
}

其中RequiredIfOtherPropertyIsNotEmptyValidationAttribute并且AllowMultiple = true

第一个返回两个属性,第二个返回一个。

导致这种情况的区别是什么?

2 个答案:

答案 0 :(得分:10)

来自the MSDN page on TypeDescriptor.GetAttributes

  

要从AttributeUsageAttribute.AllowMultiple返回AttributeCollection属性的多个实例,您的属性必须覆盖Attribute.TypeId属性。

回答一般问题“有什么区别?”:TypeDescriptor返回的值可以在运行时扩展,而Type中的值则不能。我链接的MSDN页面解释了更多。

如果您不需要这种运行时扩展,并且TypeDescriptor处理多个属性的方式是个问题,那么Type.GetCustomAttributes可能会更好。

答案 1 :(得分:0)

TypeDescriptor简单允许您在运行时扩展类型。

因此,例如,如果您想在运行时向类型添加属性,您希望稍后再检查该属性。

TypeDescriptor.AddAttributes(typeToExtend, new SomeAttribute()); 

要注意的一个重要方面是,在运行时借助TypeDescriptor添加到类型的属性,道具等只能使用TypeDescriptor而非Type来访问。

这将引发异常

typeToExtend.GetType().GetCustomAttribute<SomeAttribute>()

正确的方法。

AttributeCollection attributes = TypeDescriptor.GetAttributes(typeToExtend);

SomeAttribute attribute = (SomeAttribute)attributes[typeof(SomeAttribute)];