public DbProperty RegisterProperty(PropertyInfo pi) { var dp = new DbProperty(); dp.Name = dp.ColumnName = pi.Name; dp.Info = pi; dp.T = pi.PropertyType; if (pi.PropertyType.IsArray) { dp.PropertyType = PropertyType.IsArray; DecodeElementType(pi.PropertyType.GetElementType(), dp); } else if (pi.IsGenericList()) { dp.PropertyType = PropertyType.IsList; DecodeElementType(pi.PropertyType.GenericTypeArguments[0], dp); dp.T = pi.PropertyType; dp.Handler = PropertyHandler.AsJson; } else { dp.PropertyType = PropertyType.IsBasic; DecodeElementType(pi.PropertyType, dp); } //todo check if underlying type full fill this if (dp.ElementType == ElementTypes.Class) { dp.Handler = PropertyHandler.AsJson; return(dp); } return(dp); }
//private T MapFromSql<T>(DbClass rc, SqlDataReader reader) //{ // T t = (T)Activator.CreateInstance(typeof(T)); // var ty = typeof(T); // foreach (var p in rc.Properties) // { // var pidx = reader.GetOrdinal(p.ColumnName); // p.Info.SetValue(t, reader[pidx]); // } // return t; //} private string MapToSql(DbProperty rp) { var colName = $"{rp.ColumnName}"; var comment = ""; var sqlType = ""; var nullType = ""; var identType = ""; switch (rp.Handler) { case PropertyHandler.Default: var map = DataTypes.DataTypeMap.FirstOrDefault(x => x.CharlieType == rp.ElementType); if (map == null) { throw new Exception($"No C# to SQL mapping found for {rp.ColumnName}:{rp.ElementType}"); } sqlType = map.SqlType; if (sqlType.Contains("#")) { sqlType = sqlType.Replace("#", rp.DbSize == 0 ? "MAX" : rp.DbSize.ToString()); } nullType = $"{(rp.IsNullable ? "NULL" : "NOT NULL")}"; break; case PropertyHandler.Class: sqlType = $"NVARCHAR(max)"; nullType = "NULL"; comment = $" -- JSON Representation for class {rp.ElementTypeName}"; break; case PropertyHandler.AsJson: sqlType = $"NVARCHAR(max)"; nullType = "NULL"; comment = $" -- JSON Representation for class {rp.ElementTypeName}"; break; default: throw new Exception($"MapToSql failed for {rp.ColumnName}. No handler defined"); } if (rp.IsID) { //todo check prop is int type comment += "ID"; identType = " IDENTITY PRIMARY KEY"; } if (!string.IsNullOrEmpty(comment)) { comment = $"-- {comment}"; } return($" {colName} {sqlType}{identType} {nullType}, {comment}"); }
private object GetPropertyValue(DbProperty p, object data) { switch (p.Handler) { case PropertyHandler.Default: return(p.Info.GetValue(data, null)); case PropertyHandler.AsJson: return(JsonConvert.SerializeObject(p.Info.GetValue(data, null))); default: throw new ArgumentOutOfRangeException(); } }
public DbClass Register <T>() { var dbc = new DbClass { ClassType = typeof(T) }; dbc.SqlTableName = dbc.ClassType.Name; foreach (var p in dbc.ClassType.GetProperties()) { var rp = new DbProperty().RegisterProperty(p); dbc.Properties.Add(rp); } ClassesType.Add(dbc.ClassType.FullName, dbc); return(dbc); }
private void SetPropertyValue(DbProperty p, object dst, object v) { switch (p.Handler) { case PropertyHandler.Default: p.Info.SetValue(dst, v); break; case PropertyHandler.AsJson: var x = JsonConvert.DeserializeObject((string)v, p.T); p.Info.SetValue(dst, x); break; case PropertyHandler.Class: break; default: throw new ArgumentOutOfRangeException(); } }
private void DecodeElementType(Type type, DbProperty dp) { //dp.T = type; if (type.IsNullable()) { dp.IsNullable = true; dp.ElementType = DataTypes.DecodeType(Nullable.GetUnderlyingType(type)); } else if (type.IsEnum) { dp.ElementType = ElementTypes.Enum; dp.ElementTypeName = type.FullName; } else if (type.IsClass && type.FullName != "System.String") { dp.ElementType = ElementTypes.Class; dp.ElementTypeName = type.FullName; } else { dp.ElementType = DataTypes.DecodeType(type); } }