1. ホーム
  2. c#

[解決済み】Reflection - プロパティで属性名と値を取得する

2022-03-28 21:38:52

質問

Nameというプロパティを持つBookと呼ばれるクラスがあります。このプロパティには、属性が関連付けられています。

public class Book
{
    [Author("AuthorName")]
    public string Name
    {
        get; private set; 
    }
}

メインメソッドでは、リフレクションを使って、各プロパティの各属性のキーと値のペアを取得したいと考えています。つまり、この例では、属性名として "Author"、属性値として "AuthorName" を期待することになりますね。

質問です。Reflectionを使用して、プロパティの属性名と値を取得するにはどうすればよいですか?

どのように解決するのですか?

使用方法 typeof(Book).GetProperties() の配列を取得します。 PropertyInfo のインスタンスを作成します。 次に GetCustomAttributes() をそれぞれの PropertyInfo を持つものがあるかどうかを確認します。 Author 属性タイプです。 もしそうであれば、プロパティ情報からプロパティ名を、属性から属性値を取得することができます。

特定の属性タイプを持つプロパティをスキャンし、データをディクショナリで返す、といった内容です(ルーチンにタイプを渡すことで、よりダイナミックにできることに注意してください)。

public static Dictionary<string, string> GetAuthors()
{
    Dictionary<string, string> _dict = new Dictionary<string, string>();

    PropertyInfo[] props = typeof(Book).GetProperties();
    foreach (PropertyInfo prop in props)
    {
        object[] attrs = prop.GetCustomAttributes(true);
        foreach (object attr in attrs)
        {
            AuthorAttribute authAttr = attr as AuthorAttribute;
            if (authAttr != null)
            {
                string propName = prop.Name;
                string auth = authAttr.Name;

                _dict.Add(propName, auth);
            }
        }
    }

    return _dict;
}