2011-06-12 62 views
1

我有下面的代碼,我正在嘗試應用自定義屬性到聲明類中的字段。我在下面的錯誤中發現了錯誤'FileType'和'AllowNulls'c#問題與自定義屬性類中聲明參數

錯誤3'FieldType'不是有效的命名屬性參數。命名屬性參數必須是不是隻讀,靜態或常量的字段,或者是公共的而非靜態的讀寫屬性。 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; 
    } 

謝謝!

回答

3

您的屬性是隻讀的,屬性的命名參數必須是可讀寫的,因此您必須將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; } 
} 

注:我用後者例如自動屬性,而不是前者,因爲我喜歡做的字段在屬性中也是隻讀的(readonly字段不能在構造函數中修改)。我還將AllowNulls更改爲bool,因爲我沒有理由將它作爲字符串。

+0

非常好!你完全正確 - 我刪除了只讀部分,但沒有添加'set'。也感謝替代的例子。 Allownulls本來就是一個布爾,我已經改變它以串起來看看這是否是問題的一部分。 :) – Glinkot 2011-06-12 08:36:07