C#利用反射簡化給類字段賦值

cymt 9年前發布 | 2K 次閱讀 C#

這個例子主要的思路是建立一個類和數據庫查詢語句的字段結構是一致的
然后利用反射,直接用數據字段名稱進行拼湊,給類對象的字段進行賦值

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

</pre>

 本文由用戶 cymt 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!