C#利用反射简化给类字段赋值
2012-12-05 11:37
309 查看
说明:这个例子主要的思路是建立一个类和数据库查询语句的字段结构是一致的
然后利用反射,直接用数据字段名称进行拼凑,给类对象的字段进行赋值
1.类的定义
namespace CCB_Donet.ClassFolder
{
public class FieldRuleInfo
{
public string gStrFNo;
public string gStrFName;
public string gStrFLock;
public string gStrFCaption;
public string gStrFType;
public string gStrFMust;
public string gStrFMin;
public string gStrFMax;
public string gStrFDefault;
public string gStrFDate;
public string gStrFDB;
public string gStrFAllow;
public string gStrFDisallow;
public string gStrFSB;
public string gStrFBig;
public string gStrFSmall;
public string gStrFInputMethod;
public string gStrFCHK;
public string gStrFRelation;
public string gStrFDesc;
public string gStrFSecond;
public string gStrFQC;
public string gStrFException;
public string gStrFASupp;
public string gStrFYQH;
public string gStrFPos;
public string gStrFStar;
public string gStrFSave;
public string gStrFAddress;
public string gStrFLblColor;
public string gStrFIsCheckList;
}
}
#region 加载字段规则
private bool m_GetRule()
{
string strSQL = "";
DataTable dtGet = null;
#if(DEBUG)
try
{
#endif
if (Common.gIntTypeOrder == 95)
{
strSQL = "select A.FNo,A.FName,A.FLock,A.FCaption,A.FType," +
"A.FMust,A.FMin,A.FMax,A.FDefault,A.FDate,\r\n" +
"A.FDB,A.FAllow,A.FDisallow,A.FSB,A.FBig,A.FSmall,A.FInputMethod," +
"A.FCHK,A.FRelation,A.FDesc,A.FSecond,\r\n" +
"A.FQC,A.FException,A.FASupp,A.FYQH,A.FPos,A.FStar,A.FSave,"+
"A.FAddress,A.FLblColor,A.FIsCheckList from P_Field_Rule95 A \r\n" +
"INNER JOIN P_Field_Initial B ON A.FNo=B.FNo \r\n" +
"where A.FormType=1 AND B.FSection='1' AND " +
"(B.FRegion95=1 OR B.FRegion95=-1) ORDER BY A.FOrder";
}
else
{
strSQL = "select A.FNo,A.FName,A.FLock,A.FCaption,A.FType,"+
"A.FMust,A.FMin,A.FMax,A.FDefault,A.FDate,\r\n" +
"A.FDB,A.FAllow,A.FDisallow,A.FSB,A.FBig,A.FSmall,"+
"A.FInputMethod,A.FCHK,A.FRelation,A.FDesc,A.FSecond,\r\n" +
"A.FQC,A.FException,A.FASupp,A.FYQH,A.FPos,A.FStar,"+
"A.FSave,A.FAddress,A.FLblColor,A.FIsCheckList "+
"from P_Field_Rule A \r\n" +
"INNER JOIN P_Field_Initial B ON A.FNo=B.FNo \r\n" +
"where A.FormType=" + Common.gIntFormType.ToString() +
" AND B.FSection='1' AND (B.FRegion=" + Common.gIntRegion.ToString() +
" OR B.FRegion=-1) ORDER BY A.FOrder";
}
dtGet = DB.GetDataTableBySQL(strSQL);
if (dtGet.Rows.Count <= 0)
{
Common.ShowMessage("字段规则表没有数据,请马上联系软件工程师!", MessageBoxIcon.Error);
return false;
}
//获得类信息,为下面的反射调用做准备
Type oType = Type.GetType("CCB_Donet.ClassFolder.FieldRuleInfo");
//生成类对象数组,和数据库记录个数是一致的
mMainFieldRule = new FieldRuleInfo[dtGet.Rows.Count];
for (int i = 0; i < dtGet.Rows.Count; i++)
{
//这里使用反射动态为FieldRuleInfo字段赋值数据
mMainFieldRule[i] = new FieldRuleInfo();
for (int j = 0; j < dtGet.Columns.Count; j++)
{
//这里直接获取类的字段名称,然后把数据库里对应字段的值赋值给它
FieldInfo fieldInfo = oType.GetField("gStr" + dtGet.Columns[j].ColumnName,
BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance
| BindingFlags.Static);
fieldInfo.SetValue(mMainFieldRule[i], dtGet.Rows[i][j].ToString());
}
}
return true;
#if(DEBUG)
}
catch (Exception ex)
{
return false;
MyLog.WriteErrLog("frmDE-m_GetRule", ex.Message);
}
finally
{
dtGet = null;
}
#endif
}
#endregion
然后利用反射,直接用数据字段名称进行拼凑,给类对象的字段进行赋值
1.类的定义
namespace CCB_Donet.ClassFolder
{
public class FieldRuleInfo
{
public string gStrFNo;
public string gStrFName;
public string gStrFLock;
public string gStrFCaption;
public string gStrFType;
public string gStrFMust;
public string gStrFMin;
public string gStrFMax;
public string gStrFDefault;
public string gStrFDate;
public string gStrFDB;
public string gStrFAllow;
public string gStrFDisallow;
public string gStrFSB;
public string gStrFBig;
public string gStrFSmall;
public string gStrFInputMethod;
public string gStrFCHK;
public string gStrFRelation;
public string gStrFDesc;
public string gStrFSecond;
public string gStrFQC;
public string gStrFException;
public string gStrFASupp;
public string gStrFYQH;
public string gStrFPos;
public string gStrFStar;
public string gStrFSave;
public string gStrFAddress;
public string gStrFLblColor;
public string gStrFIsCheckList;
}
}
#region 加载字段规则
private bool m_GetRule()
{
string strSQL = "";
DataTable dtGet = null;
#if(DEBUG)
try
{
#endif
if (Common.gIntTypeOrder == 95)
{
strSQL = "select A.FNo,A.FName,A.FLock,A.FCaption,A.FType," +
"A.FMust,A.FMin,A.FMax,A.FDefault,A.FDate,\r\n" +
"A.FDB,A.FAllow,A.FDisallow,A.FSB,A.FBig,A.FSmall,A.FInputMethod," +
"A.FCHK,A.FRelation,A.FDesc,A.FSecond,\r\n" +
"A.FQC,A.FException,A.FASupp,A.FYQH,A.FPos,A.FStar,A.FSave,"+
"A.FAddress,A.FLblColor,A.FIsCheckList from P_Field_Rule95 A \r\n" +
"INNER JOIN P_Field_Initial B ON A.FNo=B.FNo \r\n" +
"where A.FormType=1 AND B.FSection='1' AND " +
"(B.FRegion95=1 OR B.FRegion95=-1) ORDER BY A.FOrder";
}
else
{
strSQL = "select A.FNo,A.FName,A.FLock,A.FCaption,A.FType,"+
"A.FMust,A.FMin,A.FMax,A.FDefault,A.FDate,\r\n" +
"A.FDB,A.FAllow,A.FDisallow,A.FSB,A.FBig,A.FSmall,"+
"A.FInputMethod,A.FCHK,A.FRelation,A.FDesc,A.FSecond,\r\n" +
"A.FQC,A.FException,A.FASupp,A.FYQH,A.FPos,A.FStar,"+
"A.FSave,A.FAddress,A.FLblColor,A.FIsCheckList "+
"from P_Field_Rule A \r\n" +
"INNER JOIN P_Field_Initial B ON A.FNo=B.FNo \r\n" +
"where A.FormType=" + Common.gIntFormType.ToString() +
" AND B.FSection='1' AND (B.FRegion=" + Common.gIntRegion.ToString() +
" OR B.FRegion=-1) ORDER BY A.FOrder";
}
dtGet = DB.GetDataTableBySQL(strSQL);
if (dtGet.Rows.Count <= 0)
{
Common.ShowMessage("字段规则表没有数据,请马上联系软件工程师!", MessageBoxIcon.Error);
return false;
}
//获得类信息,为下面的反射调用做准备
Type oType = Type.GetType("CCB_Donet.ClassFolder.FieldRuleInfo");
//生成类对象数组,和数据库记录个数是一致的
mMainFieldRule = new FieldRuleInfo[dtGet.Rows.Count];
for (int i = 0; i < dtGet.Rows.Count; i++)
{
//这里使用反射动态为FieldRuleInfo字段赋值数据
mMainFieldRule[i] = new FieldRuleInfo();
for (int j = 0; j < dtGet.Columns.Count; j++)
{
//这里直接获取类的字段名称,然后把数据库里对应字段的值赋值给它
FieldInfo fieldInfo = oType.GetField("gStr" + dtGet.Columns[j].ColumnName,
BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance
| BindingFlags.Static);
fieldInfo.SetValue(mMainFieldRule[i], dtGet.Rows[i][j].ToString());
}
}
return true;
#if(DEBUG)
}
catch (Exception ex)
{
return false;
MyLog.WriteErrLog("frmDE-m_GetRule", ex.Message);
}
finally
{
dtGet = null;
}
#endif
}
#endregion
相关文章推荐
- C#实现利用反射简化给类字段赋值的方法
- C#中利用反射操作私有字段与私有方法
- C#利用反射为属性赋值
- C# 中利用反射机制拷贝类的字段和属性(拷贝一个类对象的所有东西付给另一个类对象,而不是付给引用地址)
- 第一篇:利用反射技术给私有字段赋值
- C#中利用反射操作私有字段与私有方法
- c# 利用反射动态给实体类对象赋值
- c# 利用反射动态给实体类对象赋值
- [深入学习C#]利用反射给对象赋值
- c# 利用反射动态给实体类对象赋值
- C# 可以利用反射给只读属性赋值吗?
- 利用c#反射实现实体类生成以及数据获取与赋值
- C# 可以利用反射给只读属性赋值吗?
- C#利用反射给实体属性赋值
- 利用c#反射实现实体类生成以及数据获取与赋值
- c# 利用反射动态给实体类对象赋值
- C#反射给字段赋值
- c# 自定义字段对应数据库的基类与反射赋值
- C#中,实体属性与数据库字段的进行反射赋值收藏
- c# 利用反射动态给实体类对象赋值