在阿德里安·加勒罗的回答中补充道:
从type info调用泛型方法涉及三个步骤。
##TLDR:使用类型对象调用已知的泛型方法可以通过:##完成
((Action)GenericMethod<object>)
.Method
.GetGenericMethodDefinition()
.MakeGenericMethod(typeof(string))
.Invoke(this, null);
其中GenericMethod<object>是要调用的方法名和满足泛型约束的任何类型。
(Action)匹配要调用的方法的签名,即(Func<string,string,int> or Action<bool>)
第一步是获取泛型方法定义的MethodInfo
###方法1:使用带有适当类型或绑定标志的GetMethod()或GetMethods()
MethodInfo method = typeof(Sample).GetMethod("GenericMethod");
方法2:创建一个委托,获取MethodInfo对象,然后调用GetGenericMethodDefinition
在包含方法的类内部:
MethodInfo method = ((Action)GenericMethod<object>)
.Method
.GetGenericMethodDefinition();
MethodInfo method = ((Action)StaticMethod<object>)
.Method
.GetGenericMethodDefinition();
从包含方法的类外部:
MethodInfo method = ((Action)(new Sample())
.GenericMethod<object>)
.Method
.GetGenericMethodDefinition();
MethodInfo method = ((Action)Sample.StaticMethod<object>)
.Method
.GetGenericMethodDefinition();
在c#中,一个方法的名称,即。“ToString”或“GenericMethod”实际上指的是一组可能包含一个或多个方法的方法。在您提供方法参数的类型之前,不知道是哪一种
方法。
((Action)GenericMethod<object>)指的是特定方法的委托。((Func <字符串,int >) GenericMethod <对象>)
引用GenericMethod的不同重载
方法3:创建一个包含方法调用表达式的lambda表达式,获取MethodInfo对象,然后获取genericmethoddefinition
MethodInfo method = ((MethodCallExpression)((Expression<Action<Sample>>)(
(Sample v) => v.GenericMethod<object>()
)).Body).Method.GetGenericMethodDefinition();
这可以分解为
创建一个lambda表达式,其中主体是对所需方法的调用。
Expression<Action<Sample>> expr = (Sample v) => v.GenericMethod<object>();
提取主体并转换为MethodCallExpression
MethodCallExpression methodCallExpr = (MethodCallExpression)expr.Body;
从方法中获取泛型方法定义
MethodInfo methodA = methodCallExpr.Method.GetGenericMethodDefinition();
步骤2调用MakeGenericMethod以创建具有适当类型的泛型方法
MethodInfo generic = method.MakeGenericMethod(myType);
步骤3使用适当的参数调用方法
generic.Invoke(this, null);