如何在不使用反射的情况下通过字符串调用函数

本文关键字:字符串 调用 函数 情况下 反射的 | 更新日期: 2023-09-27 18:28:41

我正在尝试编写一些在运行时调用函数而不使用反射的东西。

以下是我的尝试,但不起作用D:

 public delegate void FunctionPointer(string t);
 public void UseFunctionPointer(string t)
    {
        FunctionPointer pointer = t;
        t();
    }

我意识到我可以使用一个巨大的开关或if/else来匹配它们,但我想保持代码的整洁。

有人能给我指正确的方向吗?或者告诉我"这是不可能的"

如何在不使用反射的情况下通过字符串调用函数

函数名称字典可以是一个选项:

var functions = new Dictionary<string, Func<float, float>>();
functions.Add("sqr", x=>x*x);
Console.WriteLine(functions["sqr"](3));

如果你想让你的方法执行不同的函数,我会使用委托。

通过这种方式,您可以传入您选择的实现,并且仍然是强类型的。

您可以使用表达式并创建它们的缓存,类似于以下内容:

private static readonly ConcurrentDictionary<Tuple<Type, string>, Action> MethodCache =
    new ConcurrentDictionary<Tuple<Type, string>, Action>();
public static void Run<T>(string method)
{
    // Calls static parameterless methods on any type
    var act = MethodCache.GetOrAdd(
        Tuple.Create(typeof (T), method),
        v =>
            {
                var mi = v.Item1.GetMethod(
                    v.Item2, BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
                return (Action) Expression.Lambda(Expression.Call(mi)).Compile();
            });
    act();
}