2008/05/20(Tue) 13:05:19 編集(投稿者)
2008/05/20(Tue) 12:56:17 編集(投稿者)
2008/05/20(Tue) 12:54:01 編集(投稿者)
2008/05/20(Tue) 12:20:03 編集(投稿者)
基本的にイヂワルなのでコアな部分を穴埋め問題形式で…ぉぃ
ちなみに、穴を埋めただけでは使えないようにしてあります。
いくつかのクラスも作らなくてはいけませんし、用法をきちんと理解しないと使え(ないはず)ません。
どう使うかは、スレ主さん次第って事で…
あ、環境ですが
VS2008Pro C#
の
Windowsフォーム
で確認してあります。
/// <summary>
/// コントロールのメソッドを実行
/// </summary>
/// <param name="baseControl">ベースのコントロール</param>
/// <param name="targetControlName">ターゲットのコントロール</param>
/// <param name="targetMethodName">ターゲットのメソッド</param>
/// <param name="methodBindingFlags">メソッドの種類</param>
/// <param name="parameters">パラメータ(必要ないときはNull)</param>
/// <returns>戻り値(voidはNullが返る)</returns>
internal static object ExecMethod(Control baseControl, string targetControlName, string targetMethodName, BindingFlags methodBindingFlags, params object[] parameters)
{
//番兵
if (baseControl == null) throw new ArgumentNullException("baseControl");
if (targetControlName == null) throw new ArgumentNullException("targetControlName");
if (targetMethodName == null) throw new ArgumentNullException("targetMethodName");
//コントロールのインデックス
int controlIndex = baseControl.Controls.IndexOfKey(targetControlName);
//なかったらエラー
if (controlIndex < 0) throw new NonControlException(targetControlName);
//メソッドインフォの取得
Type controlType = ■1■;
MethodInfo[] methodsInfo = ■2■;
//なかったらエラー
if (methodsInfo == null || (methodsInfo != null && methodsInfo.Length <= 0))
throw new NonMethodException(targetMethodName);
//パラメータの確認
MethodInfo method = null;
int parametersCount = parameters == null ? 0 : parameters.Count();
foreach(MethodInfo methodInfo in methodsInfo.Where(item=>item.Name.Equals(targetMethodName, StringComparison.CurrentCultureIgnoreCase)))
{
//パラメータインフォの取得
ParameterInfo[] paramsInfo = ■3■;
//パラメータ数の確認
if (paramsInfo.Count() != parametersCount) continue;
// 0コ だったら設定してループ終了
if(parametersCount == 0)
{
method = methodInfo;
break;
}
//パラメータの種類を確認
for(int paramIndex = 0; paramIndex < parametersCount; paramIndex++)
{
if (■4■ != parameters[paramIndex].GetType())
continue;
}
//あってたら設定してループ終了
method = methodInfo;
break;
}
//取得できなかったらエラー
if(method == null)
throw new NonMethodException(targetMethodName);
//メソッドの実行
return ■5■;
}
ex1)
string getToString = (string)xxx.ExecMethod(this, "textBox1", "ToString", BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod, null);
ex2)
xxx.ExecMethod(this, "textBox1", "AppendText", BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod, "ふぉふぉふぉ");
#バグ潰しのため修正…(汗
#baseControl引数の入力確認を忘れたです…
#修正したらインデントが…(泣
#必要なのまで削除しちゃうし…(汗