【问题标题】:c# issue with declaring parameters in a custom attribute classc# 在自定义属性类中声明参数的问题
【发布时间】:2011-06-12 15:45:56
【问题描述】:

我有下面的代码,我用它来尝试将自定义属性应用于声明的类中的字段。我在声明中的“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;
    }

谢谢!

【问题讨论】:

    标签: c# attributes


    【解决方案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,因为我认为它没有理由成为字符串。

    【讨论】:

    • 太棒了!你是对的 - 我删除了只读部分,但没有添加“集合”。也感谢其他示例。 Allownulls 最初是一个布尔值,我将其更改为字符串以查看这是否是问题的一部分。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多