我有以下情况: 116扩展方法到一个对象。 一个名为Process的主要进程,它根据函数名称列表调用其他进程。
它看起来像这个
public static void Process(this myObject,IList<string> MethodsToCallNames)
{
for(int i =0;i<MethodsToCallNames.Count;i++)
{
switch (MethodsToCallNames[i])
{
case "SubProcess1" : myObject.SubProcess1();break;
case "SubProcess2" : myObject.SubProcess2();break;
.
.
.
case "SubProcess116" : myObject.SubProcess116();break;
}
}
}
public static void SubProcess1(this myObject)
public static void SubProcess2(this myObject)
.
.
.
public static void SubProcess116(this myObject)
这是非常高效但丑陋的,如果不使用反射你会如何解决这个问题呢?
答案 0 :(得分:5)
准备Dictionary<string, Action>
,使用您的所有方法对其进行初始化,然后只需致电actions[methodName]()
。
private static Dictionary<string, Action<myObject>> _actions = new Dictionary<string, Action>() {
{ "SubProcess1", (x) => x.SubProcess1() },
{ "SubProcess2", (x) => x.SubProcess2() },
{ "SubProcess3", (x) => x.SubProcess3() },
}
public static void Process(this myObject,IList<string> MethodsToCallNames)
{
for(int i =0;i<MethodsToCallNames.Count;i++)
{
_actions[MethodsToCallNames[i]](myObject);
}
}
的更新强> 的
您还可以使用Expression Tree运行时编译的lambdas:
使用反射初始化字典private static Dictionary<string, Action<object>> _actions;
static Test()
{
_actions = typeof(Test).GetMethods(BindingFlags.Static | BindingFlags.Public)
.Where(m => m.Name.StartsWith("SubProcess"))
.ToDictionary(m => m.Name, m => GetLambda(m));
}
private static Action<object> GetLambda(MethodInfo method)
{
ParameterExpression param = Expression.Parameter(typeof(object));
return Expression.Lambda<Action<object>>(Expression.Call(method, param), param).Compile();
}
我认为您myObject
的输入为object
。将类型更改为您的类型。