示例#1
0
        /// <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);
        }
示例#2
0
 /// <summary>
 /// 指定された型に対するマッピング情報を生成します。
 /// </summary>
 /// <typeparam name="T">対象となる型情報</typeparam>
 /// <returns>テーブルマッピング情報</returns>
 public static This Create <T>() => This.Create(typeof(T));