管理大量的扩展方法

时间:2014-02-03 23:40:26

标签: c#

我有以下情况: 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)

这是非常高效但丑陋的,如果不使用反射你会如何解决这个问题呢?

1 个答案:

答案 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。将类型更改为您的类型。