/// <summary> /// リフレクションで取得したメソッドを呼び出し時にエラーが発生したことを表す NilaLib.Reflection.MethodReflectionException クラスの新しいインスタンスを作成して返します。 /// </summary> /// <param name="type">型情報。</param> /// <param name="methodName">メソッド名。</param> /// <param name="args">引数。</param> /// <param name="innerException">この例外の原因である内部例外。</param> /// <returns>NilaLib.Reflection.MethodReflectionException クラスのインスタンス。</returns> public static MethodReflectionException InvokeError(Type type, string methodName, object[] args, Exception innerException) { var ex = new MethodReflectionException(string.Format("メソッド {0}.{1} の呼び出しに失敗しました。", type.FullName, methodName), innerException); ex.Type = type; ex.MethodName = methodName; ex.Args = args; return(ex); }
/// <summary> /// リフレクション時に対象のメソッドが見つからなかったことを表す NilaLib.Reflection.MethodReflectionException クラスのインスタンスを作成して返します。 /// </summary> /// <param name="type">型情報。</param> /// <param name="methodName">メソッド名。</param> /// <param name="args">引数。</param> /// <returns>NilaLib.Reflection.MethodReflectionException クラスのインスタンス。</returns> public static MethodReflectionException NotFound(Type type, string methodName, object[] args) { var ex = new MethodReflectionException(string.Format("メソッド {0}.{1} が見つかりませんでした。", type.FullName, methodName)); ex.Type = type; ex.MethodName = methodName; ex.Args = args; return(ex); }
/// <summary> /// type 型の静的メソッド methodName を parameters を指定して呼び出します。 /// </summary> /// <param name="type">呼び出すメソッドを静的に保持する型。</param> /// <param name="methodName">呼び出すメソッド名。</param> /// <param name="parameters">メソッドに渡すパラメータ。</param> /// <returns>メソッドの戻り値が void 型の場合は null。それ以外の場合はメソッドの戻り値。</returns> public static object Call(Type type, string methodName, params object[] parameters) { var m = type.GetMethod(methodName, Reflector.StaticAllFlags); if (m == null) { throw MethodReflectionException.NotFound(type, methodName, parameters); } try { return(m.Invoke(null, parameters)); } catch (Exception ex) { throw MethodReflectionException.InvokeError(type, methodName, parameters, ex); } }
/// <summary> /// source インスタンスのメンバメソッド methodName を parameters を指定して呼び出します。 /// </summary> /// <param name="source">呼び出すメソッドをメンバとして保持するインスタンス。</param> /// <param name="methodName">呼び出すメソッド名。</param> /// <param name="parameters">メソッドに渡すパラメータ。</param> /// <returns>メソッドの戻り値が void 型の場合は null。それ以外の場合はメソッドの戻り値。</returns> public static object Call(this object source, string methodName, params object[] parameters) { var m = source.GetType().GetMethod(methodName, Reflector.InstanceAllFlags, null, parameters.Select(x => x.GetType()).ToArray(), null); if (m == null) { throw MethodReflectionException.NotFound(source.GetType(), methodName, parameters); } try { return(m.Invoke(source, parameters)); } catch (Exception ex) { throw MethodReflectionException.InvokeError(source.GetType(), methodName, parameters, ex); } }