采取以下两个代码:
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
。
第一个返回两个属性,第二个返回一个。
导致这种情况的区别是什么?
答案 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)];