У меня пользовательский атрибут, определенный так:
[AttributeUsage(AttributeTargets.Field)]
public class EnumDisplayAttribute : Attribute
{
public string Description { get; private set; }
public string Code { get; private set; }
public EnumDisplayAttribute(string description = null, string code = null)
{
Description = description;
Code = code;
}
}
Оба параметра конструктора являются необязательными.
При использовании этого атрибута в поле, подобном этому
public enum TransactionType
{
[EnumDisplay(code: "B")]
Bill,
[EnumDisplay(description: null, code: "C")]
CashReceipt,
}
В редакторе кода я не вижу никаких кривых, но я вижу неопределенную ошибку без номера строки в столбце. Сообщение об ошибке:
ошибка CS0182: аргумент атрибута должен быть константным выражением, typeof expression
или выражение создания массива типа параметра атрибута
Нажатие на ошибку ничего не делает. То есть вы не перейдете на сайт с ошибкой (очевидно, так как нет номера строки и столбца).
даже если я настроил атрибут так:
[EnumDisplay("This is a Bill")]
Компилятору это не нравится.
По сути, я вынужден предоставить оба параметра (именованные или нет), чтобы использовать этот атрибут в качестве атрибута.
Конечно, если я использую этот атрибут как обычный класс, вот так:
var enumDisplayAttribute = new EnumDisplayAttribute();
enumDisplayAttribute = new EnumDisplayAttribute(description: "This is a Bill");
enumDisplayAttribute = new EnumDisplayAttribute(code: "B");
enumDisplayAttribute = new EnumDisplayAttribute(description: "This is a Bill", code: "B");
enumDisplayAttribute = new EnumDisplayAttribute("This is a Bill", "B");
enumDisplayAttribute = new EnumDisplayAttribute("This is a Bill");
Компилятор принимает любой из вышеперечисленных "стилей".
Конечно, я что-то упустил или мой мозг просто не работает.