很多时候我们需要利用数据库存储非标准字段,即不是简单数字,货币,字符串等等,或即便是存储字符串,也希望不要直接以字符串本身存储,而是做一定的加密转换再存储,如密码。这时我们就需要用到ValueConverter类。
使用该新的ValueConverter
先看一个例子,比如在一个XPO类中,我们要存储一个Image属性,该属性为Image类型。
[ValueConverter(typeof(DevExpress.Xpo.Metadata.ImageValueConverter))]
public System.Drawing.Image Image {
get { return image; }
set {
SetPropertyValue("Image" , ref image, value);
}
}
如上面的代码,只需要为该属性加上一个ImageValueConverter属性,该字段存储到数据库和从数据库解析出来都可自动完成。
ImageValueConverter是从ValueConverter继承而来,我们要实现自己的ValueConverter也要从它继承,并实现三个方法:
object ConvertToStorageType(object) 完成XPO字段到数据库存储字段的转换
object ConvertFromStorageType(object) 完成从数据库字段解析到XPO字段类型
Type StorageType 获取数据库的存储类型
比如,现在我们要实现自己的ImageConverter:
public class ImageConverter : DevExpress.Xpo.Metadata.ValueConverter
{
public override object ConvertToStorageType(object value)
{
if (value == null)
{
return null;
}
else
{
System.IO.MemoryStream ms = new System.IO.MemoryStream();
((System.Drawing.Image)value).Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
return ms.GetBuffer();
}
}
public override object ConvertFromStorageType(object value)
{
if (value == null)
{
return null;
}
else
{
System.IO.MemoryStream ms = new System.IO.MemoryStream((byte[])value);
return new System.Drawing.Bitmap(ms);
}
}
public override Type StorageType
{
get { return typeof(byte[]); }
}
}
使用该新的ValueConverter
[ValueConverter(typeof(ImageConverter))]
public Image Photo
{
//...
}