TableBindInfo - 資料表繫結資訊
private class TableBindInfo
{
public string TableName;
public Type ObjectType;
public BindTableAttribute Attribute;
public FieldBindInfo[] Fields;
public string FieldNameList; // "欄位1,欄位2,欄位3"
}
FieldBindInfo - 欄位繫結資訊 (含轉換邏輯)
private class FieldBindInfo
{
public string FieldName;
public int FieldIndex = -1;
public PropertyInfo Property;
public Type ValueType;
public object DefaultValue;
public BindFieldAttribute Attribute;
// 物件 → 資料庫 (寫入前轉換)
public object ToDataBase(object v)
{
if (v == null || DBNull.Value.Equals(v)) return DBNull.Value;
string fmt = Attribute.WriteFormat;
if (!string.IsNullOrEmpty(fmt) && v is IFormattable)
v = ((IFormattable)v).ToString(fmt, null);
return v;
}
// 資料庫 → 物件 (讀取後轉換)
public object FromDataBase(object v)
{
if (v == null || DBNull.Value.Equals(v)) return DefaultValue;
string fmt = Attribute.ReadFormat;
if (!string.IsNullOrEmpty(fmt))
{
string s = Convert.ToString(v);
if (ValueType == typeof(DateTime))
return fmt == null ? DateTime.Parse(s) : DateTime.ParseExact(s, fmt, null);
if (ValueType == typeof(byte)) return byte.Parse(s);
if (ValueType == typeof(short)) return short.Parse(s);
if (ValueType == typeof(int)) return int.Parse(s);
if (ValueType == typeof(float)) return float.Parse(s);
if (ValueType == typeof(double)) return double.Parse(s);
return Convert.ChangeType(s, ValueType);
}
// 無格式化:直接型別匹配或轉換
if (v.GetType() == ValueType || v.GetType().IsSubclassOf(ValueType)) return v;
var converter = TypeDescriptor.GetConverter(ValueType);
if (converter != null && converter.CanConvertFrom(v.GetType()))
return converter.ConvertFrom(v);
return Convert.ChangeType(v, ValueType);
}
}
設計亮點
FieldNameList 便於快速組裝 SQL 欄位清單。
ToDataBase/FromDataBase 封裝雙向格式化與型別轉換,支援 IFormattable、TypeConverter、Parse 多重策略。
DefaultValue 處理 DBNull → CLR 預設值。
- 結構為私有類別,隱藏於框架內部,外部僅操作實體物件。