我有几种方法之一(策略1,策略2),...需要根据传入的ID调用。
是否可以在db中保存方法名称并使用存储的名称调用该方法?
目前我已将StrategyID保存为枚举,并使用在ID中传递的switch语句匹配相应的策略枚举。我不喜欢这个解决方案,因为你需要让enum与Strategies db表保持同步。
我想要做的是将开关从前端取出并放入数据库中。所以基本上我可以进行db调用(FetchStrategiesToRun)并返回相应的Strategies列表,我可以循环调用它们直接调用方法。
如果是这样,怎么做。如果是这样,有什么理由我不想这样做吗?
答案 0 :(得分:3)
这似乎与Dynamically invoking any function by passing function name as string
类似// All error checking omitted. In particular, check the results
// of Type.GetType, and make sure you call it with a fully qualified
// type name, including the assembly if it's not in mscorlib or
// the current assembly. The method has to be a public instance
// method with no parameters. (Use BindingFlags with GetMethod
// to change this.)
public void Invoke(string typeName, string methodName)
{
Type type = Type.GetType(typeName);
object instance = Activator.CreateInstance(type);
MethodInfo method = type.GetMethod(methodName);
method.Invoke(instance, null);
}
或
public void Invoke<T>(string methodName) where T : new()
{
T instance = new T();
MethodInfo method = typeof(T).GetMethod(methodName);
method.Invoke(instance, null);
}
此处有更多信息,使用System.Reflection;
http://www.dotnetperls.com/getmethod
using System;
using System.Reflection;
static class Methods
{
public static void Inform(string parameter)
{
Console.WriteLine("Inform:parameter={0}", parameter);
}
}
class Program
{
static void Main()
{
// Name of the method we want to call.
string name = "Inform";
// Call it with each of these parameters.
string[] parameters = { "Sam", "Perls" };
// Get MethodInfo.
Type type = typeof(Methods);
MethodInfo info = type.GetMethod(name);
// Loop over parameters.
foreach (string parameter in parameters)
{
info.Invoke(null, new object[] { parameter });
}
}
}
答案 1 :(得分:0)
您可以使用反射按名称调用方法。 下面的链接中提供了如何执行此操作的示例 click here