Ответ 1
Атрибут должен быть определен во время компиляции только потому, что он хранится в dll или exe. И может содержать только созданную во время компиляции информацию. Таким образом, это не может быть общим по этой причине.
Компилятор часто использует тип атрибута или его значение, поэтому вы не сможете определить его позже.
В вашем примере вы хотите пометить поле универсальным параметром:
public class Generic<Att> where Att : System.Attribute
{
[Att] //Error: 'Att' is not an attribute class
public float number;
}
Но это равно:
public class Generic<Att> where Att : System.Attribute
{
[Attribute]
public float number;
}
Потому что Att
не может быть заменен в будущем. Таким образом, нет причин использовать дженерики для атрибутов.