2

我正在开发一个应用程序,它将从我的数据库中读取数据,进行一些处理,然后将结果导出到一个固定宽度的平面文件中。

我从这个问题中的代码开始,并以此为基础。

现在,导出的文件有三种主要的数据类型,String、Num 和 Decimal(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; }
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 回答