Glinkot
Glinkot

Reputation: 2974

c# issue with declaring parameters in a custom attribute class

I have the below code which I'm using to try to apply custom attributes to fields in a declared class. I get the error below against the words 'FileType' and 'AllowNulls' in the declaration (noted below)

Error 3 'FieldType' is not a valid named attribute argument. Named attribute arguments must be fields which are not readonly, static, or const, or read-write properties which are public and not static. F:\Dropbox\Dev_LN Projects\02 Scrap\TestFieldAttributes\TestFieldAttributes\Program.cs 61 34 TestFieldAttributes

I've tried various combinations of removing static, readonly etc but no luck. Any thoughts? Thanks

[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;
    }

Thanks!

Upvotes: 1

Views: 2737

Answers (1)

Sven
Sven

Reputation: 22703

Your properties are read-only, and named arguments for an attribute must be read/write, so you must add a set method to the properties.

If you want to use read-only properties, you should use constructor arguments for the attribute rather than named arguments.

This means you could use either this:

[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; }
    } 
}

Or this:

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

Note: I used automatic properties for the latter example, but not the former, because I prefer making the fields readonly too in an attribute (readonly fields cannot be modified except in the constructor). I also changed AllowNulls to a bool since I see no reason for it to be a string.

Upvotes: 3

Related Questions