3

今朝、カスタム フィールド属性を使用するための簡単な演習になると思われる作業に着手しました。多くのことを試し、多くの例 (フィールド属性ではなくクラスに関するものがほとんど) を検索した結果、私は正式に立ち往生しました。

私のコードは以下です。特徴の 1 つは、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; }
    }

}
4

1 に答える 1

5

ものすごく単純; タイプではなく、フィールドから取得する必要があります。

foreach( FieldInfo field in userType.GetFields() )
{
    DBDataTypeAttribute attribute = (DBDataTypeAttribute)Attribute.GetCustomAttribute(field, typeof(DBDataTypeAttribute));
    if( attribute != null )
    {
        // Do something with it.
    }
}
于 2011-06-12T06:58:54.510 に答える