/// <summary> /// 指定したオブジェクトの指定したプロパティを文字列として取得します。 /// </summary> /// <param name="obj">取得元のオブジェクトを指定します。</param> /// <param name="prop">取得元のプロパティの識別子を指定します。</param> /// <returns>取得したプロパティを文字列として返します。</returns> private static string GetValue(object obj, string prop) { System.Type t = obj.GetType(); System.Reflection.PropertyInfo p = t.GetProperty(prop); if (p == null) { Application.Log.AfhOut.WriteError("指定したプロパティ " + prop + " は " + t.FullName + " には存在しません"); return(null); } else if (!p.CanRead) { Application.Log.AfhOut.WriteError("指定したプロパティ " + t.FullName + "." + prop + " には getter が実装されていません"); return(null); } object value = p.GetValue(obj, null); if (value == null) { return(null); } try{ return(afh.StringConvert.From(p.PropertyType, value)); }catch (System.Exception e) { Application.Log l = Application.Log.AfhOut; l.WriteError("値の変換中にエラーが発生しました。"); l.AddIndent(); l.WriteVar("Message", e.Message); l.WriteVar("Property", p.ReflectedType.ToString() + "." + p.Name); l.WriteVar("TargetType", p.PropertyType.ToString()); l.WriteVar("Value", value.ToString()); l.RemoveIndent(); return(null); } }
/// <summary> /// 指定した名前のデータを、指定した型で取得します。 /// </summary> /// <param name="t">取得するデータの型を指定します。</param> /// <param name="var">データを格納する変数の名前を指定します。</param> /// <returns>文字列情報を指定した型に変換して返します。</returns> /// <exception cref="System.ArgumentException"> /// 文字列から指定した型への変換に失敗した場合に発生します。 /// afh.Convert.Convert で対応している型への変換を使用して下さい。 /// </exception> public object GetValue(System.Type t, string var) { string value = this[var]; try{ return(afh.StringConvert.To(t, value)); }catch (System.Exception e) { Application.Log l = Application.Log.AfhOut; l.WriteError("値の変換中にエラーが発生しました。"); l.AddIndent(); l.WriteVar("Message", e.Message); l.WriteVar("Target Type", t.ToString()); l.WriteVar("Var Name", var); l.WriteVar("Value", value); l.RemoveIndent(); throw; } }
/// <summary> /// 指定した変数に指定した型のオブジェクトを設定します。 /// </summary> /// <param name="var">データを格納する変数の名前を指定します。</param> /// <param name="t">取得するデータの型を指定します。</param> /// <param name="value">指定したオブジェクトを文字列に変換して返します。</param> /// <exception cref="System.ArgumentException"> /// 指定したデータの型から文字列型への変換が出来なかった場合に発生します。 /// afh.Convert.Convert での変換に対応している型を使用して下さい。 /// </exception> public void SetValue(string var, System.Type t, object value) { string v; try{ v = afh.StringConvert.From(t, value); }catch (System.Exception e) { Application.Log l = Application.Log.AfhOut; l.WriteError("値の変換中にエラーが発生しました。"); l.AddIndent(); l.WriteVar("Message", e.Message); l.WriteVar("Source Type", t.Name); l.WriteVar("Var Name", var); l.WriteVar("Value", value.ToString()); l.RemoveIndent(); throw; } this[var] = v; }
//=========================================================== // プロパティの設定・取得 //=========================================================== /// <summary> /// 指定したオブジェクトの指定したプロパティに文字列で指定した値を設定します。 /// </summary> /// <param name="obj">設定先のオブジェクトを指定します。</param> /// <param name="prop">設定先のプロパティの識別子を指定します。</param> /// <param name="value">設定する値を指定します。</param> private static void SetValue(object obj, string prop, string value) { System.Type t = obj.GetType(); System.Reflection.PropertyInfo p = t.GetProperty(prop); if (p == null) { Application.Log.AfhOut.WriteError("指定したプロパティ " + prop + " は " + t.FullName + " には存在しません"); return; } else if (!p.CanWrite) { Application.Log.AfhOut.WriteError("指定したプロパティ " + t.FullName + "." + prop + " には setter が実装されていません"); return; } object val; try{ val = afh.StringConvert.To(p.PropertyType, value); }catch (System.Exception e) { Application.Log l = Application.Log.AfhOut; l.WriteError("値の変換中にエラーが発生しました。"); l.AddIndent(); l.WriteVar("Message", e.Message); l.WriteVar("Property", p.ReflectedType.ToString() + "." + p.Name); l.WriteVar("TargetType", p.PropertyType.ToString()); l.WriteVar("Value", value); l.RemoveIndent(); return; } try{ p.SetValue(obj, val, null); }catch (System.Exception e) { Application.Log l = Application.Log.AfhOut; l.WriteError("値の設定中にエラーが発生しました。"); l.AddIndent(); l.WriteVar("Message", e.InnerException == null?e.Message:e.InnerException.Message); l.WriteVar("Property", p.ReflectedType.ToString() + "." + p.Name); l.WriteVar("Value", val.ToString()); l.RemoveIndent(); return; } }