如何使用反射访问精确的方法组表达式?

时间:2015-11-02 08:16:00

标签: c# reflection

我知道如何为特定方法获取MethodInfo,并且还知道如何通过反射调用该方法。但是我无法弄清楚以下内容:

我有下面的作业声明:

Func<double, double> myFunc = Math.Sqrt;

我想通过反射得到myFunc变量的完全相同的内容,手头有MethodInfo for Math.Sqrt。不幸的是,围绕MethodInfo构建包装器lambdas或Expression并不令人满意。我想要这样的东西:

Func<double, double> myFunc = GetMethodGroupFor(methodInfoForMathSqrt);

如果孤立的样本没有解释我想要真正做到的是这里有更多的解释:

我必须使用100个方法“键”和代表填充Dictionary<string, Func<double, double>>。像:

myDictionary.Add("mykey", Math.Sqrt);

但是我不想通过100s的赋值语句来做这个,而是我希望通过反射得到100s相应的MethodInfos,然后在for循环中填充字典。

这可能吗?

1 个答案:

答案 0 :(得分:1)

我假设您将使用反射来查找与特定签名匹配的方法,如下所示:

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;
}