一个数据库的帮助类,代码如下。
publicstaticclassDbEx
{
publicstaticdynamicReadToObject(thisIDataReaderreader)
{
varobj=newDbObject();
for(inti=0;i<reader.FieldCount;i++)
{
obj[reader.GetName(i)]=newDbField()
{
DbData=reader[i]
};
}
returnobj;
}
publicclassDbObject:DynamicObject
{
//自己实现一个,不用ExpandoObject,以支持无视大小写读取
publicoverrideboolTryGetMember(GetMemberBinderbinder,outobjectresult)
{
result=this[binder.Name];
returntrue;
}
Dictionary<string,object>_values=newDictionary<string,object>(StringComparer.CurrentCultureIgnoreCase);
publicobjectthis[stringindex]
{
get=>_values[index];
set=>_values[index]=value;
}
}
publicclassDbField
{
publicobjectDbData{get;set;}
publicTValue<T>()
{
return(T)Convert.ChangeType(DbData,typeof(T));
}
publicstaticimplicitoperatorstring(DbFielddata)=>data.Value<string>();
publicstaticimplicitoperatorint(DbFielddata)=>data.Value<int>();
publicstaticimplicitoperatorDateTime(DbFielddata)=>data.Value<DateTime>();
publicstaticimplicitoperatordouble(DbFielddata)=>data.Value<double>();
publicstaticimplicitoperatorbool(DbFielddata)=>data.Value<bool>();
}
}
简单的来讲,可以把如下代码
GpsDataparse(IDataReaderreader)
{
returnnewGpsData()
{
IsValid=(bool)reader["IsValid"],
Location=newLocation()
{
Lon=(double)reader["Lon"],
Lat=(double)reader["Lat"],
},
Angle=(double)reader["Angle"],
Speed=(double)reader["Speed"]),
UpdateTime=(double)reader["Speed"]),
};
}
转换为如下形式
GpsDataparse(IDataReaderreader)
{
varobj=reader.ReadToObject();
varstate=newGpsData()
{
IsValid=obj.IsValid,
Location=newLocation()
{
Lon=obj.Lon,
Lat=obj.Lat,
},
Angle=obj.Angle,
Speed=obj.Speed,
UpdateTime=obj.UpdateTime,
};
returnstate;
}
|