我知道如何获取特定方法的MethodInfo,也知道如何通过反射调用该方法。然而,我无法理解以下内容:
我有下面的任务说明:
Func<double, double> myFunc = Math.Sqrt;
我想通过反射获得myFunc变量的完全相同的内容,手头有MethodInfo for Math.Sqrt。不幸的是,围绕MethodInfo构建包装器lambdas或Expression并不令人满意。我想要这样的东西:
Func<double, double> myFunc = GetMethodGroupFor(methodInfoForMathSqrt);
如果孤立的样本不能解释我真正想做的事情,这里有更多的解释:
我必须在Dictionary<string, Func<double, double>>
中填写100个方法"密钥"和委托。类似:
myDictionary.Add("mykey", Math.Sqrt);
然而,我不想通过100秒的赋值语句来实现这一点,相反,我希望通过反射获得100秒的适当MethodInfos,然后在for循环中填充字典。
这可能吗?
我假设您将使用反射来查找与特定签名匹配的方法,如下所示:
IEnumerable<MethodInfo> methods = typeof(Math).GetMethods()
.Where(method =>
{
if (method.ReturnType != typeof(double))
return false;
var parameters = method.GetParameters();
return parameters.Length == 1 && parameters[0].ParameterType == typeof(double);
});
从那里,你可以填写你的字典如下:
var methodLookup = new Dictionary<string, Func<double, double>>();
foreach (MethodInfo method in methods)
{
var name = method.DeclaringType.Name + "." + method.Name;
var d = (Func<double, double>)Delegate.CreateDelegate(typeof(Func<double, double>), method);
methodLookup[name] = d;
}