基于条件的代码库

时间:2013-01-18 22:25:56

标签: c# .net

我必须编写一堆小代码片段来执行字符串连接和基于数字代码的变换。这些代码的数量将达到数百和数千。

显然,我可以构建一个巨大的switch语句来执行与该数字代码相关的代码。这看起来很笨拙。好像我可以创建类似的东西:

1001: if (x != null) {
    console.writeline("Not Null");
} else {
    console.writeline("Null");
}

然后每当我需要运行该代码时,我都可以调用1001,并执行代码。

不确定这是否有意义,但我以前从未将值映射到一段源代码。

3 个答案:

答案 0 :(得分:2)

作为假设,如果所有“片段”都使用单个整数变量(是的,相当大的假设),您可以使用字典来存储它们,如下所示:

public class CodeRepo
{
  private Dictionary<int, Func<int, int>> snippets = new Dictionary<int, Func<int, int>>();

  public void RegisterCodeSnippet(int key, Func<int, int> code)
  {
    if (!snippets.ContainsKey(key))
      snippets.Add(key, code);  
  }

  public Func<int, int> GetCodeSnippet(int key)
  {
    if (snippets.ContainsKey(key))
      return snippets[key];
    return null;
  }

  public IEnumerable<int> RunAllSnippets(int parameter)
  {
    foreach (var item in snippets)
      yield return item.Value(parameter);
  }
}

您可以使用该存储库,如:

CodeRepo repo = new CodeRepo();
repo.RegisterCodeSnippet(1, x => x); //identity function;
repo.RegisterCodeSnippet(2, x => x * x);//x squared
repo.RegisterCodeSnippet(3, x => Math.Sign(x));//sign of x
// etc...

var square = repo.GetCodeSnippet(2);
Console.WriteLine(square(7)); //writes 49

//runs all snippets in order, produces 3, 9, 1
foreach (int result in repo.RunAllSnippets(3))
{
  Console.WriteLine(result);
}

答案 1 :(得分:1)

您可以创建List<Action>并按顺序分配每个代码段,然后您可以使用列表索引调用它们:

public List<Action> Actions {get;set;}

public void CreateActions()
{
  Action action0000 = () => {//code snippet here};

  Actions.Add(action0000);

  //.. etc etc etc

}

然后在调用它时:

public void CallAction(int code)
{
    Actions[code]();
}

答案 2 :(得分:0)

一种替代方案是反射(MethodBase.Invoke)。这使您的代码段可以进行单元测试。我自己没有测试过,但它看起来像是:

class MyClass
{
    public void Fn100() {...}
    public void Fn101() {...}
    public void Fn102() {...}
}

public class Program
{
    public static void Main()
    {
        ExecFnNumber("100");
        ExecFnNumber("105");
    }

    public static void ExecFnNumber(string num)
    {
        // can probably optimize by not instantiating
        // myType, myTypeObject every time.
        Type myType = typeof(MyClass);

        // create an instance
        var myTypeObject = new MyClass();

        // call method without params
        MethodInfo method = myType.GetMethod("Fn" + num);
        method.Invoke(myTypeObject, new object[]{});
    }
}

另请参阅MSDN - MethodBase.Invoke