По сути, атрибут сам по себе ничего не делает, его нужно анализировать с помощью какой-то структуры. То, что фактически делает эта структура, полностью зависит от создателя атрибутов. Таким образом, инфраструктура может просто проверить наличие атрибута, но, конечно, она также может вызывать своих членов.
Итак, представьте, что у вас есть этот код:
[MyAttribute]
class MyClass
{
}
class MyAttribute : Attribute
{
public void DoSomething();
}
Теперь у вас есть код, который проверяет наличие атрибута и, если да, вызывает DoSomething
:
// get types with the attribute
var typesAndAttributes= myAssembly.GetTypes().Select(x => new
{
Type = x,
Attribute = Attribute.GetCustomAttribute(x, typeof(MyAttribute))
});
// now call DoSomething for every attribute
forerach(var e in typesAndAttributes)
{
e.Attribute?.DoSomething();
}
В вашем примере MaxLengthAttribute
это означает следующее. Если вы украсите своего члена так:
MaxLengthAttribute(2)
public int[] MyArr = new int[3];
и выполнить код, который фреймворк вызывает IsValid
для MyArr
и, вероятно, (не уверен в этом, не проверял исходный код) вернет false, так как значение содержит 3 элемента, хотя только два считаются действительными.