2012-08-10 52 views
2

我正在研究一個將從我的數據庫中讀取數據的應用程序,執行一些處理,然後將結果導出到固定寬度的平面文件。我可以在屬性內有屬性嗎?

我開始與this問題的代碼,並大廈。

現在,導出文件有三種主要數據類型:字符串,數字和小數(x,y);其中x是小數點左邊的數字,y是右邊的數字。

我有這個,只要我的自定義屬性:

public class FixedWidthColumn : Attribute 
{ 
    public int Position { get; set; } 
    public int Length { get; set; } 

    public FixedWidthColumn(int position, int length) 
    { 
     Position = position; 
     Length = length; 
    } 
} 

是否有可能創建一個自定義屬性(或者一些其他結構),我可以用它來建立這樣的性質:

[FixedWidthColumn(3,2, String)] 
public string CompanyId 

[FixedWidthColumn(6, 20, Num)] 
public int Sku { get; set; } 

[FixedWidthColumn(5, 10, Decimal(6,4)] 
public decimal Price { get; set; } 
+0

看起來像'FixedWidthColumn'需要兩個參數,但你在例子中傳入三個 – dtsg 2012-08-10 15:54:08

+0

是的;它是僞代碼;只是試圖舉一個例子,我想最終的輸出是類似於 – 2012-08-10 15:57:07

+0

這很酷/迂迴 – dtsg 2012-08-10 15:58:39

回答

2

您可以擴展FixedWidthColumnAttribute以攜帶參數類型屬性。

 public enum FixedWidthColumnType 
     { 
      String, 
      Num, 
      Decimal 
     } 

     [AttributeUsage(AttributeTargets.Property)] 
     public class FixedWidthColumnAttribute : Attribute 
     {  
      public int Position { get; private set; }  
      public int Length { get; private set; }   
      public int Digits {get;set;} 
      public int FractionalDigits {get;set} 

      public FixedWidthColumnType Type {get; private set;} 
      public FixedWidthColumn(int position, int length, 
        FixedWidthColumnType type) 

      {   this.Position = position;   
         this.Length = length;  
         this.Type = type; 
      } 


     } 

用法:

  [FixedWidthColumn(4, 10, FixedWidthColumnType.String)] 

     [FixedWidthColumn(5, 6, FixedWidthColumnType.Decimal, Digits = 3, FractionalDigits = 4)] 
0

我會建議使用繼承,例如:

public class FixedWidthDecimalAttribute : FixedWidthColumnAttribute 
... 
public FixedWidthDecimal(int position, int wholeDigits, int fractionalDigits) 
... 
[FixedWidthDecimal(5, 6, 4)] 

在您檢查代碼,你可以GR從所有的FixedWidthColumnAttribute對象中,允許繼承,然後檢查類型(使用GetType)以確定它是什麼類型的對象。

2

首先,你應該重命名你的類名FixedWithColumn爲FixedWithColumnAttribute。也許,這只是一個慣例;但我認爲這是爲了應用C#語義所必需的。 其次,你應該表明在調用屬性聲明typeof運算(類型):

[FixedWidthColumn(3,2,typeof(String))] 

三,聲明構造這樣的:

public FixedWidthColumnAttribute(int position, int length, Type objType) 

我希望它可以幫助你

+0

它*只是一個約定,C#和其他.NET語言將允許其他名稱(顯然是C#規則如果它不會導致歧義,則可以在名稱末尾省略「屬性」,但不適用於在名稱末尾沒有「屬性」的情況)。遵循這樣的約定仍然是一個非常好的主意。 – 2012-08-10 16:02:57

+0

因此,在這個例子中,我如何告訴它包含小數類型的小數位數? – 2012-08-10 16:47:40

+0

您可以將派生的NumberFormatInfo實例傳遞給屬性類的參數,並將CurrencyDecimalDigits設置爲適當的值 – user1587368 2012-08-10 18:34:08

1

要回答具體問題:不可以在屬性中有屬性。

屬性在其構造函數中只能使用有限範圍的數據類型。例子見MSDN documentation。所以你不能擁有一個暴露類作爲屬性的屬性。

相關問題