C#利用反射简化给类字段赋值

2018-07-20    来源:open-open

容器云强势上线!快速搭建集群,上万Linux镜像随意使用
这个例子主要的思路是建立一个类和数据库查询语句的字段结构是一致的
然后利用反射,直接用数据字段名称进行拼凑,给类对象的字段进行赋值
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
 

标签: 数据库

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点!
本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。

上一篇:C#解压GZip文件代码

下一篇: android获取SD卡的状态