/// <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="dir"> /// プラグインのファイルが配置してあるディレクトリを指定して下さい。 /// 指定したディレクトリが存在しない場合には新しくディレクトリを作成します。 /// </param> private static void ReadAssemblies(string dir) { if (!System.IO.Directory.Exists(dir)) { System.IO.Directory.CreateDirectory(dir); return; } //--declarations System.Reflection.Assembly asm; System.Type[] types; System.Reflection.MemberInfo[] mems; object[] attrs; Plugin.PluginReaderAttribute reader; Application.Log l = Application.Log.AfhOut; l.WriteError("プラグイン読込開始"); l.AddIndent(); l.WriteLine("------------------"); //--reading loop foreach (string path in System.IO.Directory.GetFiles(dir, "*.dll")) { try{ asm = System.Reflection.Assembly.LoadFrom(path); l.WriteLine("Load Assembly: " + asm.ToString().Split(new char[] { ',' })[0] + " at " + path); types = asm.GetTypes(); for (int i = 0, iM = types.Length; i < iM; i++) { if (types[i].Name != CLASSNAME) { continue; } Application.Log.AfhOut.WriteLine("Load Type : " + types[i].FullName); //if(!type.IsClass||!type.IsPublic||type.IsAbstract||type.GetInterface(iface)==null)continue; mems = types[i].GetMembers(STATIC_MEMBER); for (int j = 0, jM = mems.Length; j < jM; j++) { attrs = mems[j].GetCustomAttributes(typeof(Plugin.PluginReaderAttribute), false); if (attrs.Length == 0) { continue; } reader = (Plugin.PluginReaderAttribute)attrs[0]; Application.Log.AfhOut.WriteLine("Read Member : " + mems[j].Name + " -> " + reader.GetType().FullName); reader.Read(mems[j]); } } }catch (System.Exception e) { Application.Log.AfhOut.WriteError(e, "Assembly " + path + " の読込中にエラーが発生しました"); } } l.WriteLine("------------------"); l.WriteLine("プラグイン読込終了"); l.RemoveIndent(); }
/// <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; } }