我正在开发一个应用程序,它将从我的数据库中读取数据,进行一些处理,然后将结果导出到固定宽度的平面文件。
我开始使用this问题中的代码,然后构建它。
现在,导出文件有三种主要数据类型: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; }
答案 0 :(得分: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)]
答案 1 :(得分:2)
首先,您应该将类名称FixedWithColumn重命名为FixedWithColumnAttribute。 也许,这只是一个惯例;但我认为这是为了应用C#语义所必需的。 其次,您应该在调用属性声明中指明typeof(Type):
[FixedWidthColumn(3,2,typeof(String))]
第三,声明构造函数:
public FixedWidthColumnAttribute(int position, int length, Type objType)
我希望它可以帮到你
答案 2 :(得分:1)
回答具体问题:不,你不能在属性中拥有属性。
属性只能在其构造函数中采用有限范围的数据类型。有关示例,请参阅MSDN documentation。因此,您无法将类作为属性公开。
答案 3 :(得分:0)
我建议使用继承,例如:
public class FixedWidthDecimalAttribute : FixedWidthColumnAttribute
...
public FixedWidthDecimal(int position, int wholeDigits, int fractionalDigits)
...
[FixedWidthDecimal(5, 6, 4)]
在您的考试代码中,您可以获取所有FixedWidthColumnAttribute
个对象,允许继承,然后检查类型(使用GetType
)以确切确定它是什么类型的对象。