从C#中的自定义字段属性获取值

时间:2011-06-12 06:49:11

标签: c# attributes filehelpers

今天早上,我开始尝试使用自定义字段属性的快速练习。尝试了很多东西并搜索了许多例子(大多数涉及阶级而不是字段属性),我正式陷入困境。

我的代码如下。一个特点是该类是使用classbuilder在FileHelpers中构建的。我的各种部分成功尝试确实设法从这个类获得了字段名,所以我相信这部分工作正常。

我想要做什么(根据代码中的注释)是a)遍历字段,b)为每个字段运行,查看DBDataTypeAttribute属性是否存在,以及c)看似最难的部分 - 从属性中获取值(FieldType字符串和AllowNulls bool)。

任何评论都赞赏!

标记

class Program
{
    static void Main(string[] args)
    {
        // Desired output:
        System.Type userType = null;
        userType = ClassBuilder.ClassFromString(@"
                                                public class ExpenseReport
                                                {
                                                    [FieldQuoted('""', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
                                                    [DBDataTypeAttribute(FieldType = ""varchar(1000)"", AllowNulls = true)]
                                                    public String UniqueID;
                                                    [FieldQuoted('""', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
                                                    public String ERNum;
                                                }");

        object[] attributes;
        attributes = userType.GetCustomAttributes(typeof(DBDataTypeAttribute), true);
        foreach (Object attribute in attributes)
        {
            // Would like to be able to ID for each field whether the DBDataTypeAttribute is present, and get the FieldType and AllowNulls Values

            DBDataTypeAttribute a = (DBDataTypeAttribute)attribute;
            Console.WriteLine("Attribute: ", a.FieldType);
            Console.ReadLine();

        }
    }
}

[AttributeUsage(AttributeTargets.Field)]
public class DBDataTypeAttribute : System.Attribute
{
    private string fieldtype;
    public string FieldType
    {
        get { return fieldtype; }
    }

    private string allownulls;
    public string AllowNulls
    {
        get { return allownulls; }
    }

}

1 个答案:

答案 0 :(得分:5)

非常简单;你必须从字段中获取它们,而不是类型。

foreach( FieldInfo field in userType.GetFields() )
{
    DBDataTypeAttribute attribute = (DBDataTypeAttribute)Attribute.GetCustomAttribute(field, typeof(DBDataTypeAttribute));
    if( attribute != null )
    {
        // Do something with it.
    }
}