我正在尝试编写一些在运行时调用函数而不使用反射的东西。
以下是我无效的尝试D:
public delegate void FunctionPointer(string t);
public void UseFunctionPointer(string t)
{
FunctionPointer pointer = t;
t();
}
我意识到我可以使用巨型开关或if / else来匹配它们,但我想保持代码清洁。
有人能指出我正确的方向吗? 或告诉我“这是不可能的”答案 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();
}