/// <summary>
 ///     获取数据库成员信息
 /// </summary>
 /// <param name="member">成员信息</param>
 /// <returns>数据库成员信息</returns>
 internal static TmphDataMember Get(TmphMemberIndex member)
 {
     var value = member.GetAttribute<TmphDataMember>(true, false);
     if (value == null || value.DataType == null)
     {
         if (member.Type.IsEnum)
         {
             if (value == null) value = new TmphDataMember();
             value.DataType = Enum.GetUnderlyingType(member.Type);
         }
         else
         {
             var sqlMember = TmphTypeAttribute.GetAttribute<TmphDataMember>(member.Type, false, false);
             if (sqlMember != null && sqlMember.DataType != null)
             {
                 if (value == null) value = new TmphDataMember();
                 value.DataType = sqlMember.DataType;
                 if (sqlMember.DataType.nullableType() != null) value.IsNull = true;
             }
         }
     }
     else if (member.Type.IsEnum)
     {
         var TEnumType = Enum.GetUnderlyingType(member.Type);
         if (TEnumType != value.DataType) value.TEnumType = TEnumType;
     }
     if (value == null)
     {
         var nullableType = member.Type.nullableType();
         if (nullableType == null)
         {
             if (TmphTypeAttribute.GetAttribute<TmphSqlColumn>(member.Type, false, false) == null)
             {
                 var dataType = member.Type.formCSharpType().toCSharpType();
                 if (dataType != member.Type)
                 {
                     value = new TmphDataMember();
                     value.DataType = dataType;
                 }
             }
         }
         else
         {
             value = new TmphDataMember();
             value.IsNull = true;
             var dataType = nullableType.formCSharpType().toCSharpType();
             if (dataType != nullableType) value.DataType = dataType.toNullableType();
         }
     }
     return value ?? NullDataMember;
 }
 /// <summary>
 ///     字段信息
 /// </summary>
 /// <param name="field"></param>
 /// <param name="attribute"></param>
 public TmphFieldInfo(TmphFieldIndex field, TmphDataMember attribute)
 {
     Field = field.Member;
     DataMember = attribute;
     MemberMapIndex = field.MemberIndex;
 }
 /// <summary>
 ///     格式化数据库成员信息
 /// </summary>
 /// <param name="value"></param>
 /// <param name="type"></param>
 /// <returns></returns>
 internal static TmphDataMember FormatSql(TmphDataMember value, Type type, ref bool isSqlColumn)
 {
     if (type.IsEnum)
     {
         var TEnumType = Enum.GetUnderlyingType(type);
         if (value == null) return new TmphDataMember { DataType = Enum.GetUnderlyingType(type) };
         if (value.DataType == null) value.DataType = Enum.GetUnderlyingType(type);
         else if (TEnumType != value.DataType) value.TEnumType = TEnumType;
         return value;
     }
     Type nullableType = null;
     if (type.IsGenericType)
     {
         var genericType = type.GetGenericTypeDefinition();
         if (genericType == typeof(TmphJsonMember<>))
         {
             if (value == null) return new TmphDataMember { DataType = typeof(string) };
             value.DataType = typeof(string);
             return value;
         }
         if (genericType == typeof(TmphFileBlockMember<>))
         {
             if (value == null) return new TmphDataMember { DataType = typeof(TmphFileBlockStream.TmphIndex) };
             value.DataType = typeof(TmphFileBlockStream.TmphIndex);
             return value;
         }
         if (genericType == typeof(Nullable<>)) nullableType = type.GetGenericArguments()[0];
     }
     else if (TmphTypeAttribute.GetAttribute<TmphSqlColumn>(type, false, false) != null)
     {
         isSqlColumn = true;
         return NullDataMember;
     }
     if (value == null || value.DataType == null)
     {
         var sqlMember = TmphTypeAttribute.GetAttribute<TmphDataMember>(type, false, false);
         if (sqlMember != null && sqlMember.DataType != null)
         {
             if (value == null) value = new TmphDataMember();
             value.DataType = sqlMember.DataType;
             if (sqlMember.DataType.IsValueType && sqlMember.DataType.IsGenericType &&
                 sqlMember.DataType.GetGenericTypeDefinition() == typeof(Nullable<>))
                 value.IsNull = true;
         }
     }
     if (value == null)
     {
         if (nullableType == null)
         {
             var dataType = type.formCSharpType().toCSharpType();
             if (dataType != type) value = new TmphDataMember { DataType = dataType };
         }
         else
         {
             value = new TmphDataMember { IsNull = true };
             var dataType = nullableType.formCSharpType().toCSharpType();
             if (dataType != nullableType) value.DataType = dataType.toNullableType();
         }
     }
     return value ?? NullDataMember;
 }