2011-06-12 117 views
3

今天早上我开始了我认为是使用自定义字段属性的快速练习。经过许多尝试并搜索了很多例子(大多数涉及类而不是字段属性),我被正式卡住了。从C#中的自定义字段属性中获取值

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

我想做的事情(根据代码中的注释)是a)遍历字段,b)为每个字段查看是否存在DBDataTypeAttribute属性,以及c)看似最难的部分 - 从属性(FieldType字符串和AllowNulls布尔)。

任何意见赞赏!

马克

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; } 
    } 

} 

回答

4

很简单;你必须从田间拿到他们,而不是种类。

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

谢谢Sven。在'做些什么'的情况下,如何获得FieldType和AllowNulls的值(在本例中为varchar(1000)和true)这是我无法做到的。 – Glinkot 2011-06-12 07:41:53

+0

只需使用'attribute.FieldType'和'attribute.AllowNulls'属性即可。你遇到了什么问题? – Sven 2011-06-12 07:47:18

+0

根本没有!我试图使用gettype等另一种方法,甚至没有看到那些属性。谢谢你的帮助! – Glinkot 2011-06-12 08:33:26