Name というプロパティを持つ Book というクラスがあります。そのプロパティには、属性が関連付けられています。
public class Book
{
[Author("AuthorName")]
public string Name
{
get; private set;
}
}
メイン メソッドでは、リフレクションを使用して、各プロパティの各属性のキーと値のペアを取得したいと考えています。したがって、この例では、属性名として「Author」、属性値として「AuthorName」が表示されることを期待します。
質問: Reflection を使用してプロパティの属性名と値を取得するにはどうすればよいですか?
ベストアンサー1
を使用しtypeof(Book).GetProperties()
てインスタンスの配列を取得しますPropertyInfo
。次に、GetCustomAttributes()
各インスタンスに対して を使用してPropertyInfo
、それらのいずれかにAuthor
Attribute タイプがあるかどうかを確認します。そうである場合は、プロパティ情報からプロパティの名前を取得し、属性から属性値を取得できます。
特定の属性タイプを持つプロパティのタイプをスキャンし、辞書にデータを返すには、次のようにします (ルーチンにタイプを渡すことで、これをより動的にできることに注意してください)。
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;
}