私はリフレクションを学習していますが、保存してからロードしてトリガーできるシリアル化可能なアクションタイプに取り組んでいます。 serializeableアクションは、パラメータを持たないメソッドまたはint、float、double、stringまたはbool型の単一パラメータをサポートします。名前が渡されたのいずれか、彼らはまた、デフォルト値を持つつの属性を持っている可能性が上に挙げた種類のつの属性を持っているか、なしすべての属性を持っている方法のC#のリフレクションを使用した単一または無の属性のメソッドを取得する
すべて。 ここに私の問題が来る。まず、オーバーロードを持つメソッドに対してtarget.GetType().GetMethod(methodName);
を呼び出すと、AmbiguousMatchExceptionが発生し、オプションの単一のパラメータでメソッドを呼び出すとNULLが返されます。
私が今行っているのは、AmbiguousMatchExceptionをキャッチするtry-catchから始まり、指定されたメソッドにオーバーロードがあることがわかります。
public static MethodInfo GetMethod(string methodName, Object _target)
{
try
{
MethodInfo info = _target.GetType().GetMethod(methodName);
return info;
}
catch (AmbiguousMatchException ex)
{
MethodInfo info = _target.GetType().GetMethod(methodName, new System.Type[0]);
if (info != null) return info;
info = _target.GetType().GetMethod(methodName, new[] { typeof(int) });
if (info != null) return info;
info = _target.GetType().GetMethod(methodName, new[] { typeof(float) });
if (info != null) return info;
info = _target.GetType().GetMethod(methodName, new[] { typeof(double) });
if (info != null) return info;
info = _target.GetType().GetMethod(methodName, new[] { typeof(string) });
if (info != null) return info;
info = _target.GetType().GetMethod(methodName, new[] { typeof(bool) });
return info;
}
}
これは非常に醜いですが、それはオーバーロードされたメソッドのためにいい作品:私は例外を取得した場合、私はを検索するためのさまざまな属性タイプの方法通過アレイを取得しようとし始めます。ただし、メソッドにオプションのパラメータがある場合はNULLを返します。 OptionalParamBindingバインディングフラグを使用しようとしましたが、オーバーロードされていないメソッドとオプションの単一のパラメータに対してもNULLを返しました。
私の質問は次のとおりです: どうすればいいですか? - int、float、double、stringまたはboolパラメータを持つメソッドのオーバーロード - それが失敗した場合は、オプションのint、float、double、stringまたはboolパラメータによるオーバーロード - それが失敗した場合は、パラメータなしのオーバーロード
代わりに 'GetMethods'を使用して、一致するものが見つかるまでループすることができます。個人的には、特定の方法が必要な場合は、正しい方法を見つけるのに役立つと期待されているパラメータの種類を求めています。 – TyCobb