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

时间:2012-03-21 04:54:32

标签: c#

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

以下是我无效的尝试D:

 public delegate void FunctionPointer(string t);

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

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

有人能指出我正确的方向吗? 或告诉我“这是不可能的”

3 个答案:

答案 0 :(得分:3)

按名称划分的函数字典可以是一个选项:

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

Console.WriteLine(functions["sqr"](3));

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您可以使用表达式并创建它们的缓存,如下所示:

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