c# проблем с деклариране на параметри в клас персонализиран атрибут

Имам кода по-долу, който използвам, за да се опитам да приложа персонализирани атрибути към полета в деклариран клас. Получавам грешката по-долу срещу думите „FileType“ и „AllowNulls“ в декларацията (отбелязана по-долу)

Грешка 3 „FieldType“ не е валиден наименуван аргумент на атрибут. Аргументите на именувания атрибут трябва да бъдат полета, които не са само за четене, статични или const, или свойства за четене и запис, които са публични, а не статични. F:\Dropbox\Dev_LN Projects\02 Scrap\TestFieldAttributes\TestFieldAttributes\Program.cs 61 34 TestFieldAttributes

Опитах различни комбинации от премахване на статично, само за четене и т.н., но без успех. някакви мисли? Благодаря

[AttributeUsage(AttributeTargets.Field)]
public class DBDataTypeAttribute : System.Attribute
{
    private string fieldtype;
    public string FieldType
    {
        get { return fieldtype; }
    }

    private string allownulls;
    public string AllowNulls
    {
        get { return allownulls; }
    }

}

public class ExpenseReport
    {
        [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
        [DBDataTypeAttribute(FieldType = "varchar(1000)", AllowNulls = "true")]// errors on this line
        public String UniqueID;
        [FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
        public String ERNum;
    }

Благодаря!


person Glinkot    schedule 12.06.2011    source източник


Отговори (1)


Вашите свойства са само за четене и наименуваните аргументи за атрибут трябва да се четат/записват, така че трябва да добавите set метод към свойствата.

Ако искате да използвате свойства само за четене, трябва да използвате аргументи на конструктора за атрибута, а не именувани аргументи.

Това означава, че можете да използвате или това:

[AttributeUsage(AttributeTargets.Field)]
public class DBDataTypeAttribute : System.Attribute
{
    private readonly string _fieldType;
    private readonly bool _allowNulls;

    public DBDataTypeAttribute(string fieldType, bool allowNulls)
    {
        _fieldType = fieldType;
        _allowNulls = allowNulls;
    }

    public string FieldType 
    {
        get { return _fieldType; } 
    } 

    public bool AllowNulls
    { 
        get { return _allowNulls; }
    } 
}

Или това:

[AttributeUsage(AttributeTargets.Field)]
public class DBDataTypeAttribute : System.Attribute
{
    public string FieldType { get; set; }
    public bool AllowNulls { get; set; }
}

Забележка: Използвах автоматични свойства за последния пример, но не и за първия, защото предпочитам да направя полетата само за четене също в атрибут (полетата само за четене не могат да се променят освен в конструктора). Също така промених AllowNulls на bool, тъй като не виждам причина да е низ.

person Sven    schedule 12.06.2011
comment
Отлично! Вие сте напълно прав - премахнах частта само за четене, но не добавих "набор". Благодаря и за алтернативните примери. Allownulls първоначално беше bool, аз го промених на string, за да видя дали това е част от проблема. :) - person Glinkot; 12.06.2011