/// <summary> /// 指定された型に対するマッピング情報を生成します。 /// </summary> /// <param name="type">対象となる型情報</param> /// <returns>テーブルマッピング情報</returns> public static This Create(System.Type type) { if (type == null) { throw new ArgumentNullException(nameof(type)); } This result = null; lock (This.Cache) { //--- キャッシュから取得 if (!This.Cache.TryGetValue(type, out result)) { //--- テーブル情報 var table = type.GetCustomAttribute <TableAttribute>(false); result = new This() { Schema = table?.Schema ?? null, Name = table?.Name ?? type.Name, Type = type }; //--- 列情報(モデル内に存在するコレクションは除外する var flags = BindingFlags.Instance | BindingFlags.Public; var notMapped = typeof(NotMappedAttribute); //typeMapに存在するカラムだけを対象にする var targetProperties = type.GetProperties(flags) .Where(x => TypeMap.ContainsKey(x.PropertyType)); result.Columns = targetProperties .Where(x => x.CustomAttributes.All(y => y.AttributeType != notMapped)) .Select(FieldMappingInfo.From) .ToArray(); //--- キャッシュ This.Cache.TryAdd(type, result); } } return(result); }
/// <summary> /// 指定された型に対するマッピング情報を生成します。 /// </summary> /// <typeparam name="T">対象となる型情報</typeparam> /// <returns>テーブルマッピング情報</returns> public static This Create <T>() => This.Create(typeof(T));