/// <summary> /// 我要update set所有資料,可是如果資料為null我就不要update他 /// </summary> public void SetAll() { var parameters = new DynamicParameters(); var viewModel = new ValuesFromMeModel() { ValueIsString = "111", ValuelikeString = "222", ValueString = "333" }; string updateSql = @" --更新設定檔 UPDATE T_Set_POInfo "; string strSet = @" SET BRPOST = @BRPOST \r\n"; //取得我viewModel所有資料 var properties = viewModel.GetType().GetProperties(); foreach (var item in properties) { //當我確定model有值才更新資料,GetValue return object 還要再回傳string if (!string.IsNullOrEmpty(item.GetValue(viewModel).ToString())) { //set column 後 sql cmd 換行 //可是這是字串插值 弱掃不會給過 strSet += " ," + item.Name + " = @" + item.Name + "\r\n"; parameters.Add("@" + item.Name, item.GetValue(viewModel), DbType.String); } } string strPk = @"WHERE BRPOST = @BRPOST"; string strSql = updateSql + strSet + strPk; var result = new SqlCeConnection("my sql connection str").Execute(strSql, parameters); }
/// <summary> /// 遍歷物件屬性、值 /// </summary> public void ObjectGetValues() { var value = new ValuesFromMeModel() { ValueIsString = "111", ValuelikeString = "222", ValueString = "333" }; var properties = value.GetType().GetProperties(); //Type myType = typeof(ValuesFromMeModel); //FieldInfo[] fieldInfos = myType.GetFields(); //for (int i = 0; i < fieldInfos.Length; i++) //{ // var v = (ValuesFromMeModel)fieldInfos[i].GetValue(value); // Console.WriteLine("Name: " + v); //} foreach (var item in properties) { Console.WriteLine( "Name: " + item.Name + ", value: " + item.GetValue(value, null) + ", dbType:" + (DbType?)Enum.GetNames(typeof(DbType)).ToList().IndexOf(item.PropertyType.Name) + " , dbEnum value: " + Enum.GetNames(typeof(DbType)).ToList().IndexOf(item.PropertyType.Name) ); } }
/// <summary> /// 遍歷屬性 只讓"部分"符合條件者賦值 /// 當我物件長得有夠像,且賦值來源又都差不多的時候 /// </summary> public void ObjectFiltSetValue() { //資料參考 //google 關鍵字 C#遍歷物件屬性 //如果我要賦值 https://www.itread01.com/content/1546423213.html //如果我只是要讀取 https://tedliou.com/archives/csharp-read-all-class-field-by-loop/ var item = new NameAlikeModel(); var value = new ValuesFromMeModel() { ValueIsString = "111", ValuelikeString = "222", ValueString = "333" }; System.Reflection.PropertyInfo[] properties = item.GetType().GetProperties(); for (int i = 0; i < properties.Length; i++) { var properity = item.GetType().GetProperty($"weAreAlike{i + 1}"); //SetValue 是 PropertyInfo[]原生語法 properity.SetValue(item, value.ValuelikeString); } var result = item; var cardData = new NameAlikeModel(); PropertyInfo[] cardDataPara = cardData.GetType().GetProperties(); for (int j = 0; j < 10; j++) { cardData.GetType().GetProperty($"WKMALKNDNM6C{j + 1}").SetValue(cardData, ""); cardData.GetType().GetProperty($"MYMAILNO20X{j + 1}").SetValue(cardData, ""); cardData.GetType().GetProperty($"WK_IMPDATE{j + 1}").SetValue(cardData, ""); } //var BoxMailKindArr = new[] { "1", "2", "3", "5", "6", "7", "8", "10", "9A", "11", "BC", "DE", "H", "P" }; //var LostMailKindArr = new[] { "1", "2", "3", "5", "6", "7", "8", "9A", "10", "11", "BC", "DE", "F", "G", "H", "P" }; //var StateCodeArr = new[] { "1", "2", "3", "4" }; //foreach (var s in StateCodeArr) //{ // foreach (var k in LostMailKindArr) // { // if (s == "1") // { // var bxCnt = BoxMails.Where(o => o.STACODE != "D" && o.MALKND == k).Count(); // var lmCnt = LostMails.Where(o => o.STACODE != "D" && o.MALKND == k).Count(); // ReportPara.GetType().GetProperty($"BXMALKND_{k}_1_7")?.SetValue(ReportPara, bxCnt); // ReportPara.GetType().GetProperty($"LMMALKND_{k}_1_7")?.SetValue(ReportPara, bxCnt); // } // else // { // var bxCnt = BoxMails.Where(o => o.STACODE == s && o.MALKND == k).Count(); // var lmCnt = LostMails.Where(o => o.STACODE == s && o.MALKND == k).Count(); // ReportPara.GetType().GetProperty($"BXMALKND_{k}_{s}_7")?.SetValue(ReportPara, bxCnt); // ReportPara.GetType().GetProperty($"LMMALKND_{k}_{s}_7")?.SetValue(ReportPara, lmCnt); // } // } //} }
/// <summary> /// C# 也需要deep copy 噁心 跟js一樣噁心 /// /// </summary> public void CheckCopy() { var form = new ValuesFromMeModel() { ValueIsString = "111", ValuelikeString = "222", ValueString = "333", }; //1. //model extend clone can cut the reference effect var v1 = (ValuesFromMeModel)form.Clone(); var result = v1; //2. //direct use equal is call by reference will be change by asign value change var v2 = form; v2.ValueIsString = "我改變了"; result = v2; var father = new ValueFather { ValueForFather = "123" }; //3. //invalid cast 不能直接強轉 father被繼承 少不能倒給多 //ValuesFromMeModel v3 = (ValuesFromMeModel)father; //4. //through mapper and inheritence dont have reference effect var config = new MapperConfiguration(cfg => cfg.CreateMap <ValueFather, ValuesFromMeModel>()); var mapper = new Mapper(config); ValuesFromMeModel v4 = mapper.Map <ValuesFromMeModel>(father); father.ValueForFather = "父親改變了"; result = v4; //5. //through mapper dont have reference effect, even there's no inherent relate var config1 = new MapperConfiguration(cfg => cfg.CreateMap <ValuesFromMeModel, LikeValuesFromMeModel>()); var mapper2 = new Mapper(config1); LikeValuesFromMeModel v5 = mapper2.Map <LikeValuesFromMeModel>(form); var result2 = v5; //6. 一模一樣的物件 到給他 不可以 clone他只會回傳一樣的類型 //LikeValuesFromMeModel v6 = (LikeValuesFromMeModel)form.Clone(); //var result3 = v6; //7. dumbest way var v7 = new LikeValuesFromMeModel { ValueIsString = form.ValueIsString, ValuelikeString = form.ValuelikeString, ValueString = form.ValueString }; }