C# で汎用的な関数を実装をしたい場合、リフレクションを使用したくなる。
(1) Entity クラス
Entity のプロパティに以下のような属性がついている場合、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace HogeNameSpace { [Table("hogehoge")] // (1) public class HogeEntity { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] [Column("id")] public long Id { get; set; } [Required] [Index(IsUnique = true)] // (2) [Column("name")] // (3) [StringLength(128)] // (4) public string Name { get; set; } } } |
(2) リフレクションを使用する
リフレクションを使用することで、各属性値を取得することができる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace HogeNameSpace { public class Hoge { static void Main(string[] args) { string tableName = GetClassAttribute<TableAttribute>(typeof(HogeEntity)).Name; Console.WriteLine("(1) tableName = " + tableName); HogeEntity entity = new HogeEntity(); bool isUnique = GetPropertyAttribute<IndexAttribute>(nameof(entity.Name)).IsUnique; Console.WriteLine("(2) isUnique = " + isUnique); string columnName = GetPropertyAttribute<ColumnAttribute>(nameof(entity.Name)).Name; Console.WriteLine("(3) columnName = " + columnName); int maxLength = GetPropertyAttribute<StringLengthAttribute>(nameof(entity.Name)).MaximumLength; Console.WriteLine("(4) maxLength = " + maxLength); Console.WriteLine("Press any key to exit..."); Console.ReadKey(); } public static T GetClassAttribute<T>(Type classType) where T : Attribute { var attrType = typeof(T); return (T)classType.GetCustomAttributes(attrType, false).First(); } public static T GetPropertyAttribute<T>(string propertyName) where T : Attribute { var attrType = typeof(T); var property = typeof(HogeEntity).GetProperty(propertyName); return (T)property.GetCustomAttributes(attrType, false).First(); } } } |
以上