2

数百のプロパティを含むクラスがあります。各プロパティは、[CategoryAttribute("My Category Name")] 属性句で宣言されているため、PropertyGrid で適切に表示されます。この同じ CategoryAttribute 属性を使用して、特定の categoryAttribute カテゴリでラベル付けされたクラス内のすべてのプロパティの値を設定したいと考えています。以下のコードはコンパイルおよび実行されますが、att_coll には、私が期待していた CategoryAttribute 属性が含まれていないため、タスクを達成しません。誰もこれを行う方法を知っていますか? 本当にありがとう。

    class my_class
    {
        [CategoryAttribute("Category One")]
        public int property_1
        {
             get { return _property_1; }
             set { _property_1 = value; }
        }

        [CategoryAttribute("Category One")]
        public int property_2
        {
             get { return _property_2; }
             set { _property_2 = value; }
        }
    }

    void ClearCatagory(string category_name)
    {
        CategoryAttribute target_attribute = new CategoryAttribute(category_name);

        Type my_class_type = my_class.GetType();
        PropertyInfo[] prop_info_array = my_class_type.GetProperties();

        foreach (PropertyInfo prop_info in prop_info_array)
        {
            AttributeCollection att_coll = TypeDescriptor.GetAttributes(prop_info);

            CategoryAttribute ca = (CategoryAttribute) att_col[typeof(CategoryAttribute)];

            if (ca.Equals(target_attribute))
            {
                prop_info.SetValue(my_class, 0, null);
            } 
        }
    }
4

3 に答える 3

2

の代わりに、 MemberInfo.GetCustomAttributesインスタンス メソッドを使用しますTypeDescriptor.GetAttriburtes

呼び出しはobject[] attributes = prop_info.GetCustomAttributes(typeof(CategoryAttriute), false).

または、リフレクションとTypeDescriptor.GetPropertiesTypeDescriptorType.GetProperties の使用を切り替える必要はありません。


また、ドキュメントCategory.Equalsは正確には明確ではありませんが、参照の等価性を実装している可能性があります (クラスが明示的にオーバーライドしない限り、これは C# の既定値です) 。つまりEquals、 の値に関係なく、比較されるインスタンスがまったく同じ場合にのみ true が返されますCategory。その場合、ca.Equals(target_attribute)参照は異なるオブジェクトであるため、常に false になります。

代わりに、値に格納されている文字列値を比較してみてくださいCategory。文字列は値の等価性を実装しているため、文字String.Equals列に格納されている値が比較されます。

だから交換

if (ca.Equals(target_attribute))

if (ca.Cateogry.Equals(category_name))
于 2013-10-20T03:05:36.600 に答える
0

これを解決してくれた shf301 に感謝します。コードの作業バージョンは次のとおりです。

    class my_class
    {
        [CategoryAttribute("Category One")]
        public int property_1
        {
                get { return _property_1; }
                set { _property_1 = value; }
        }
    }

    void ClearCatagory(string category_name)
    {
        Type my_class_type = my_class.GetType();
        PropertyInfo[] prop_info_array = my_class_type.GetProperties();

        foreach (PropertyInfo prop_info in prop_info_array)
        {
            CategoryAttribute[] attributes = (CategoryAttribute[]) prop_info.GetCustomAttributes(typeof(CategoryAttribute), false);
            foreach(CategoryAttribute ca in attributes)
            {
                if (ca.Category == category_name)
                {
                    prop_info.SetValue(my_class, 0, null);
                }
            }
        }
    }
于 2013-10-21T01:00:17.293 に答える