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

说明:这个例子主要的思路是建立一个类和数据库查询语句的字段结构是一致的

         然后利用反射,直接用数据字段名称进行拼凑,给类对象的字段进行赋值

 

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

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值