利用dynamic简化数据库的访问
今天寫了一個數據庫的幫助類,代碼如下。?
1 public static class DbEx 2 { 3 public static dynamic ReadToObject(this IDataReader reader) 4 { 5 var obj = new DbObject(); 6 7 for (int i = 0; i < reader.FieldCount; i++) 8 { 9 obj[reader.GetName(i)] = new DbField() 10 { 11 DbData = reader[i] 12 }; 13 } 14 15 return obj; 16 } 17 18 public class DbObject : DynamicObject 19 { 20 //自己實現一個,不用ExpandoObject, 以支持無視大小寫讀取 21 public override bool TryGetMember(GetMemberBinder binder, out object result) 22 { 23 result = this[binder.Name]; 24 return true; 25 } 26 27 Dictionary<string, object> _values = new Dictionary<string, object>(StringComparer.CurrentCultureIgnoreCase); 28 29 public object this[string index] 30 { 31 get => _values[index]; 32 set => _values[index] = value; 33 } 34 } 35 36 public class DbField 37 { 38 public object DbData { get; set; } 39 40 public T Value<T>() 41 { 42 return (T)Convert.ChangeType(DbData, typeof(T)); 43 } 44 45 public static implicit operator string(DbField data) => data.Value<string>(); 46 public static implicit operator int(DbField data) => data.Value<int>(); 47 public static implicit operator DateTime(DbField data) => data.Value<DateTime>(); 48 public static implicit operator double(DbField data) => data.Value<double>(); 49 public static implicit operator bool(DbField data) => data.Value<bool>(); 50 } 51 } View Code簡單的來講,可以把如下代碼
GpsData parse(IDataReader reader)
{
????return new GpsData()
????{
????????IsValid = (bool)reader["IsValid"],
????????Location = new Location ()
????????{
????????????Lon = (double)reader["Lon"],
????????????Lat = (double)reader["Lat"],
????????},
????????Angle = (double)reader["Angle"],
????????Speed = (double)reader["Speed"]),
????????UpdateTime = (double)reader["Speed"]),
????};
}
轉換為如下形式
GpsData parse(IDataReader reader)
{
????var obj = reader.ReadToObject();
????var state = new GpsData()
????{
????????IsValid = obj.IsValid,
????????Location = new Location()
????????{
????????????Lon = obj.Lon,
????????????Lat = obj.Lat,
????????},
????????Angle = obj.Angle,
????????Speed = obj.Speed,
????????UpdateTime = obj.UpdateTime,
????};
????return state;
}
主要還是利用dynamic的特性,轉換成這樣的好處有:
總結
以上是生活随笔為你收集整理的利用dynamic简化数据库的访问的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 总结——LR学习总结
- 下一篇: PAT天梯赛 L1-050 倒数第N个字