答え
Type.GetMethod(String name, Type[] types)
プログラムによるオーバーロード解決を行うために使用します。次に例を示します。
MethodInfo methodToInvoke = typeof(MyClass)
.GetMethod("myFunc", new System.Type[] { typeof(BaseClass) });
説明
この例では、取得するメソッドのパラメーター リストが配列で指定されているため、は でmethodToInvoke
はありmyFunc(BaseClass bc)
ません。myFunc(DerivedClass dc)
types
MSDN のドキュメントからにType.GetMethod(String name, Type[] types)
は、次の 2 つのパラメーターがあります。
name
取得するメソッドの名前です。
types
メソッドのパラメーターの順序、数、および型を提供します。
コードの実行
これは、プログラムによるオーバーロードの解決を示す実行中のフィドルです。
using System;
using System.Reflection;
public static class Program
{
public static void Main()
{
MethodInfo methodToInvoke = typeof(MyClass)
.GetMethod("myFunc", new System.Type[] { typeof(BaseClass) });
var result = methodToInvoke
.Invoke(new MyClass(), new object[] { new BaseClass() });
Console.WriteLine(result);
}
public class MyClass
{
public static string myFunc(BaseClass bc) {
return "BaseClass";
}
public static string myFunc(DerivedClass dc) {
return "DerivedClass";
}
}
public class BaseClass { }
public class DerivedClass : BaseClass { }
}
出力はBaseClass
です。
編集:これは堅牢です。
GetMethod
params
、さらに派生したクラス、デリゲート、およびインターフェイスの実装を取る解決済みのメソッド。この Fiddle は、これらすべてのケースを示しています。呼び出しとそれらが取得するものは次のとおりです。
で動作しますparams
MethodInfo methodToInvoke2 = typeof(MyClass).GetMethod(
"myFunc",
new System.Type[] { typeof(Int32[]) });
このメソッドを解決します
public static string myFunc(params int[] i)
{
return "params";
}
より多くの派生クラスで動作します
MethodInfo methodToInvoke3 = typeof(MyClass).GetMethod(
"myFunc",
new System.Type[] { typeof(MoreDerivedClass) });
を取るメソッドを解決しますMoreDerivedClass
public class BaseClass { }
public class DerivedClass : BaseClass { }
public class MoreDerivedClass : DerivedClass {}
代理人と連携する
MethodInfo methodToInvoke4 = typeof(MyClass).GetMethod(
"myFunc",
new System.Type[] { typeof(MyDelegate) });
... このデリゲートを取るメソッドを取得します。
public delegate void MyDelegate(string x);
インターフェイスの実装で動作します
MethodInfo methodToInvoke5 = typeof(MyClass).GetMethod(
"myFunc",
new System.Type[] { typeof(MyImplementation) });
... を取るメソッドを正常に取得しますMyImplementation
public interface IMyInterface {}
public class MyImplementation : IMyInterface {}
したがって、それは堅牢であり、GetMethod
動作が期待できない場合にオーバーロード解決を行うために使用できます。