如何在不使用反射的情况下通过字符串调用函数
本文关键字:字符串 调用 函数 情况下 反射的 | 更新日期: 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();
}