Hatena::Groupmediaforcelabs

どうも、小松です。

 | 

2009-11-25

AnnotationならぬAttribute

| 19:21

どうも、小松です。


JavaでいうところのAnnotation(アノテーション)をSilverlight(C#)で使いたいと思ったのですが、

検索してもなかなか見つかりません。

Validationで使用するAnnotationは見つかるのですが、カスタムのAnnotationを作成する方法は

なかなか見つかりません。

ようやく辿り着いたのがブログの記事で、.NetではAttribute(アトリビュート)が似た役割を持っているそうです。

いい情報をありがとうございます。(長い英語なのでちゃんと読んでませんが)


とりあえずAttributeを使えばいいということがわかったので試してみたいと思います。

0. はじめに

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

OSWindows Server 2008 R2 Standard
開発ツールVisual Studio 2010 Ultimate Beta2

1. Attributeの作成。

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

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

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

  今回は、エンティティのプロパティの略称を付与するShortNameAtributeを作成します。

using System;

namespace TestAttribute.Attributes
{
    // Attributeクラスを継承する。
    public class ShortNameAttribute : Attribute
    {
        private string _Name;

        // コンストラクタは、Attributeが設定されるときに呼ばれる。
        public ShortNameAttribute(string value)
        {
            _Name = value;
        }

        public string Name
        {
            get
            {
                return _Name;
            }
            set
            {
                _Name = value;
            }
        }
    }
}

2. Attributeを使用する。

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

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

 2-3. Personクラスを作成します。各プロパティの略称を指定します。

using TestAttribute.Attributes;

namespace TestAttribute.Entities
{
    public class Person
    {
        [ShortName("i")]
        public int id { get; set; }

        [ShortName("fn")]
        public string FirstName { get; set; }

        [ShortName("ln")]
        public string LastName { get; set; }

        [ShortName("a")]
        public int Age { get; set; }
    }
}

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

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

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

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

 3-2. MainPage.xamlです。

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

<UserControl x:Class="TestAttribute.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:DesignHeight="300" d:DesignWidth="400">
    <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 TestAttribute.Attributes;
using TestAttribute.Entities;

namespace TestAttribute
{
    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, FirstName = "太郎", LastName = "メディア", Age = 33 };
        }

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

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

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

                // ShortNameAttributeのNameプロパティの値を取得します。
                string name = ((ShortNameAttribute)attribute).Name;

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

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

4. 実行結果。

 f:id:coma2:20091125191429p:image

 正しく表示されました。

 次は、複数のプロパティを保持したAttributeについて調べてみたいと思います。


 **2009/12/02追記 ここから**

 複数のプロパティを持ったAttributeを試してみました。

 **2009/12/02追記 ここまで**

HelenaHelena2012/02/20 13:51Good job miakng it appear easy.

pwkzswpqipppwkzswpqipp2012/02/21 18:14iIgpZi <a href="http://nivnptrvjbsq.com/">nivnptrvjbsq</a>

katkzmetkatkzmet2012/02/21 23:01huFkYG , [url=http://shhgniakqehb.com/]shhgniakqehb[/url], [link=http://dejpkuldllcq.com/]dejpkuldllcq[/link], http://fztdszwizlcx.com/

 |