C#实现利用反射简化给类字段赋值的方法
本文实例讲述了C#实现利用反射简化给类字段赋值的方法。分享给大家供大家参考。具体分析如下:
说明:这个例子主要的思路是建立一个类和数据库查询语句的字段结构是一致的
然后利用反射,直接用数据字段名称进行拼凑,给类对象的字段进行赋值
1.类的定义
namespaceCCB_Donet.ClassFolder
{
publicclassFieldRuleInfo
{
publicstringgStrFNo;
publicstringgStrFName;
publicstringgStrFLock;
publicstringgStrFCaption;
publicstringgStrFType;
publicstringgStrFMust;
publicstringgStrFMin;
publicstringgStrFMax;
publicstringgStrFDefault;
publicstringgStrFDate;
publicstringgStrFDB;
publicstringgStrFAllow;
publicstringgStrFDisallow;
publicstringgStrFSB;
publicstringgStrFBig;
publicstringgStrFSmall;
publicstringgStrFInputMethod;
publicstringgStrFCHK;
publicstringgStrFRelation;
publicstringgStrFDesc;
publicstringgStrFSecond;
publicstringgStrFQC;
publicstringgStrFException;
publicstringgStrFASupp;
publicstringgStrFYQH;
publicstringgStrFPos;
publicstringgStrFStar;
publicstringgStrFSave;
publicstringgStrFAddress;
publicstringgStrFLblColor;
publicstringgStrFIsCheckList;
}
}
#region加载字段规则
privateboolm_GetRule()
{
stringstrSQL="";
DataTabledtGet=null;
#if(DEBUG)
try
{
#endif
if(Common.gIntTypeOrder==95)
{
strSQL="selectA.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.FIsCheckListfromP_Field_Rule95A\r\n"+
"INNERJOINP_Field_InitialBONA.FNo=B.FNo\r\n"+
"whereA.FormType=1ANDB.FSection='1'AND"+
"(B.FRegion95=1ORB.FRegion95=-1)ORDERBYA.FOrder";
}
else
{
strSQL="selectA.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"+
"fromP_Field_RuleA\r\n"+
"INNERJOINP_Field_InitialBONA.FNo=B.FNo\r\n"+
"whereA.FormType="+Common.gIntFormType.ToString()+
"ANDB.FSection='1'AND(B.FRegion="+Common.gIntRegion.ToString()+
"ORB.FRegion=-1)ORDERBYA.FOrder";
}
dtGet=DB.GetDataTableBySQL(strSQL);
if(dtGet.Rows.Count<=0)
{
Common.ShowMessage("字段规则表没有数据,请马上联系软件工程师!",MessageBoxIcon.Error);
returnfalse;
}
//获得类信息,为下面的反射调用做准备
TypeoType=Type.GetType("CCB_Donet.ClassFolder.FieldRuleInfo");
//生成类对象数组,和数据库记录个数是一致的
mMainFieldRule=newFieldRuleInfo[dtGet.Rows.Count];
for(inti=0;i<dtGet.Rows.Count;i++)
{
//这里使用反射动态为FieldRuleInfo字段赋值数据
mMainFieldRule[i]=newFieldRuleInfo();
for(intj=0;j<dtGet.Columns.Count;j++)
{
//这里直接获取类的字段名称,然后把数据库里对应字段的值赋值给它
FieldInfofieldInfo=oType.GetField("gStr"+dtGet.Columns[j].ColumnName,
BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Instance
|BindingFlags.Static);
fieldInfo.SetValue(mMainFieldRule[i],dtGet.Rows[i][j].ToString());
}
}
returntrue;
#if(DEBUG)
}
catch(Exceptionex)
{
returnfalse;
MyLog.WriteErrLog("frmDE-m_GetRule",ex.Message);
}
finally
{
dtGet=null;
}
#endif
}
#endregion
希望本文所述对大家的C#程序设计有所帮助。