• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

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

OC/C/C++ 水墨上仙 1911次浏览

这个例子主要的思路是建立一个类和数据库查询语句的字段结构是一致的
然后利用反射,直接用数据字段名称进行拼凑,给类对象的字段进行赋值
来源:http://blog.csdn.net/limlimlim/article/details/8259157

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)
加载中……