回答
用于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)
有两个参数:
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
在我们可能不希望工作的情况下使用重载解决方案。