Hatena::Groupmediaforcelabs

どうも、小松です。

 | 

2009-12-02

複数のプロパティを持ったAttribute

| 18:44

どうも、小松です。


以前のエントリで、プロパティが一つのカスタムAttributeを作成してみました。

今回は、複数のプロパティを持ったカスタムAttributeを作成してみます。


0. はじめに

開発環境は、以下のとおりです。

OSWindows 7 Enterprise
開発ツールVisual Studio 2008

1. Attributeの作成。

 1-1. プロジェクトを作成します。(名前は、「TestAttribute2」にしました。)

 1-2. Attributeを保存するフォルダ「Attributes」を作成します。

 1-3. Attributeを作成します。

  今回は、複数のプロパティを持ったMyAttributeAttributeを作成します。

  (Attributeを使用するとき、最後のAttributeを除いた名前で指定するため、こんな名前にしてしまいました。)

using System;

namespace TestAttribute2.Attributes
{
    public class MyAttributeAttribute : Attribute
    {
        private string _Attr1;
        private string _Attr2;
        private string _Attr3;

        public MyAttributeAttribute(string value)
        {
            _Attr1 = value;
        }

        public string Attr1
        {
            get { return _Attr1; }
            set { _Attr1 = value; }
        }

        public string Attr2
        {
            get { return _Attr2; }
            set { _Attr2 = value; }
        }

        public string Attr3
        {
            get { return _Attr3; }
            set { _Attr3 = value; }
        }

    }
}

2. Attributeを使用する。

 2-1. Personクラスを作成し、そこでMyAttributeAttributeを使用してみます。

 2-2. Personクラスを保存する「Entities」フォルダを作成します。

 2-3. Personクラスを作成し、Attributeのプロパティに値を入力します。

  コンストラクタ引数となる値は、そのまま値を指定します。

  その他のプロパティに値を入力するには、「プロパティ名 = 値」という形式で指定します。

using TestAttribute2.Attributes;

namespace TestAttribute2.Entities
{
    public class Person
    {
        [MyAttribute("id1", Attr2 = "id2", Attr3 = "id3")]
        public int id { get; set; }
    }
}

3. Attributeで設定した値を取得する。

 3-1. 確認のため、2で設定した値を取得したいと思います。

  MainPage.xamlのLayoutRootがロードされたときにPersonクラスのインスタンスを作成し、

  ボタンを用意し、ボタンをクリックしたら、PersonのAttributeの値を表示します。

 3-2. MainPage.xamlです。

  ボタンを一つ用意し、あとはイベントハンドラを指定します。

<UserControl x:Class="TestAttribute2.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d"
    d:DesignWidth="640" d:DesignHeight="480">
    <Grid x:Name="LayoutRoot"
          Background="White"
          Loaded="LayoutRoot_Loaded">
        <Button x:Name="myButton"
                Width="100" Height="30"
                Content="get attributes"
                Click="myButton_Click"/>
    </Grid>
</UserControl>

 3-3. MainPage.xaml.csです。

using System;
using System.Reflection; // for PropertyInfo
using System.Windows;
using System.Windows.Controls;
using TestAttribute2.Attributes;
using TestAttribute2.Entities;

namespace TestAttribute2
{
    public partial class MainPage : UserControl
    {
        private Person person;

        public MainPage()
        {
            InitializeComponent();
        }

          private void LayoutRoot_Loaded(object sender, RoutedEventArgs e)
        {
            // Personをインスタンス化し、初期値を入力します。
            person = new Person() { id = 1 };
        }

        private void myButton_Click(object sender, RoutedEventArgs e)
        {
            string str = "";

            // personの型を取得します。
            Type type = person.GetType();

            foreach (PropertyInfo pInfo in type.GetProperties())
            {
                // pInfoからMyAttributeAttribute型のAttributeを取得します。
                MyAttributeAttribute attribute
                    = (MyAttributeAttribute)Attribute.GetCustomAttribute(pInfo, typeof(MyAttributeAttribute));

                // MyAttributeAttributeのプロパティの値を取得します。
                string attr1 = attribute.Attr1;
                string attr2 = attribute.Attr2;
                string attr3 = attribute.Attr3;

                // strにプロパティ名、値、MyAttributeAttributeのプロパティ値を追加します。
                str += pInfo.Name + ":\n"
                    + "  value: " + pInfo.GetValue(person, null) + "\n"
                    + "  attr1: " + attr1 + "\n"
                    + "  attr2: " + attr2 + "\n"
                    + "  attr3: " + attr3 + "\n";
            }

            // strをMessageBoxで表示します。
            MessageBox.Show(str);
        }
    }
}

4. 実行結果。

 f:id:coma2:20091202184003p:image

 正しく表示されました。

 コンストラクタ引数を複数にすることもできそうですね。

JenniferJennifer 2012/02/18 04:08 Felt so hopeless lokoing for answers to my questions...until now.

silvawyqngsilvawyqng 2012/02/19 18:15 ryRu8r <a href="http://ltsysdnmglod.com/">ltsysdnmglod</a>

epndcupjuyzepndcupjuyz 2012/02/20 00:08 KIudxT , [url=http://gmxujedmtivu.com/]gmxujedmtivu[/url], [link=http://elxaamasdvjj.com/]elxaamasdvjj[/link], http://vaxbpfqmfocj.com/

bgksgslaabgksgslaa 2012/02/24 03:19 Uppe0T <a href="http://xblbmgiquvty.com/">xblbmgiquvty</a>

ゲスト



トラックバック - http://mediaforcelabs.g.hatena.ne.jp/coma2/20091202
 |