У меня есть настраиваемый атрибут:
[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,
}
Я не вижу в редакторе кода каких-либо squigglies, но я вижу неопределенную ошибку без номера строки File of column. Сообщение об ошибке:
error 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");
Компилятор примет любой из вышеперечисленных "стилей".
Конечно, я что-то упускаю, или мой мозг просто не работает.