我可以在属性中包含属性吗?

时间:2012-08-10 15:48:24

标签: c# custom-attributes

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

我开始使用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; }

4 个答案:

答案 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)以确切确定它是什么类型的对象。