C#內我們可以通過反射來動態獲取實例方法和靜態方法,不管方法存在多少個重載都可以通過GetMethod內的第二個參數去篩選出所要獲取的方法,代碼如下:
type.GetMethod("方法名", new Type[]{ });//第二個參數是方法對應的參數類型數組
但是當我們要獲取的是一個泛型方法且該方法存在其他重載方法的時候,就會出現異常,異常如下:

在這種情況下,只能通過將相應方法名的方法全部獲取出來,然后通過遍歷去查找符合條件的方法,代碼如下:
var methods = targetType.GetMethods(BindingFlags.Public | BindingFlags.Instance).Where(m => m.Name == "方法名" && m.IsGenericMethod);
foreach (MethodInfo method in methods)
{
var parameters = method.GetParameters();
if (parameters.Length != parameterTypes.Length)
continue;
for (var i = 0; i < parameters.Length; i++)
{
if (parameters[i].ParameterType != parameterTypes[i])
break;
}
//獲取到方法
}
以上代碼僅僅是對於實例對象內的public方法進行查找,如果想要查找靜態的public的其他方法,需要修改的地方只有方法的名字和BindingFlags參數就可以了,因此重構一下上面的代碼就能滿足其他的需求了,重構后的代碼如下:
public static MethodInfo GetGenericMethod(Type targetType, string name, BindingFlags flags, params Type[] parameterTypes)
{
var methods = targetType.GetMethods(flags).Where(m => m.Name == name && m.IsGenericMethod);
foreach (MethodInfo method in methods)
{
var parameters = method.GetParameters();
if (parameters.Length != parameterTypes.Length)
continue;
for (var i = 0; i < parameters.Length; i++)
{
if (parameters[i].ParameterType != parameterTypes[i])
break;
}
return method;
}
return null;
}
由於C#3.0為我們提供了擴展方法,因此可以讓方法的調用更加簡單,而且更能表達方法的作用,只需要在以上代碼中的Type targetType前加入this關鍵字就可以啦,於是乎就可以用以下代碼進行調用了:
type.GetGenericMethod("方法名", 綁定約束, 參數數組);
今天的主題就到這里啦,謝謝!
