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

标签 c# reflection

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

我有下面的赋值语句:

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

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

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

如果孤立的样本没有解释我真正想做的事情,这里有更多的解释:

我必须填写 Dictionary<string, Func<double, double>>有数百个方法“键”和代表。喜欢:

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

但是我不想通过 100 条赋值语句来做到这一点,相反我想通过反射获得 100 条适当的 MethodInfo,然后在 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;
}

关于c# - 如何使用反射访问精确的方法组表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33473253/

相关文章:

c# - Windows 10 放大镜 API 鼠标点击坏了?

c# - 创建 ActionBlock<T> 列表,该列表将在任何失败时完成

java - 是否可以使用 jni 增强反射性能?

reflection - 如何从函数类型中获取函数?

java - 使用Java反射,我可以访问私有(private)静态嵌套类类型的私有(private)字段吗?

java - 如何测试类中的 for 循环是否可用?

c# - IdMemberMap 为 null 使用 "Representation Serialization Options"

c# - 与自定义比较器不同会给出 vauge 错误

c# - 如何在 WPF 应用程序页面而不是窗口中禁用最大化按钮

java - 如何使用反射访问对象中的字段值