2

データベースからデータを読み込み、何らかの処理を行い、結果を固定幅のフラット ファイルにエクスポートするアプリに取り組んでいます。

この質問のコードから始めて、それを構築しています。

現在、エクスポートされたファイルには、String、Num、および Decimal(x,y) の 3 つの主要なデータ型があります。ここで、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; }
4

4 に答える 4

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)]
于 2012-08-10T15:56:25.810 に答える
2

まず、クラス名 FixedWithColumn を FixedWithColumnAttribute に変更する必要があります。たぶん、それは単なる慣例です。しかし、C#セマンティクスを適用するにはそれが必要だと思います。次に、呼び出し属性宣言で typeof(Type) を指定する必要があります。

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

第三に、コンストラクターを次のように宣言します。

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

お役に立てれば幸いです

于 2012-08-10T15:58:28.893 に答える
1

特定の質問に答えるには:いいえ、属性内に属性を持つことはできません。

属性は、そのコンストラクターで限られた範囲のデータ型のみを取ることができます。例については、 MSDN のドキュメントを参照してください。したがって、クラスをプロパティとして公開する属性を持つことはできません。

于 2012-08-10T16:02:38.853 に答える
0

たとえば、継承を使用することをお勧めします。

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

検査コードでは、すべてのFixedWidthColumnAttributeオブジェクトを取得して継承を許可し、( を使用してGetType) タイプを検査して、それがどの種類のオブジェクトであるかを正確に判断できます。

于 2012-08-10T15:55:24.303 に答える