0

我必须编写一堆小代码片段来执行基于数字代码的字符串连接和转换。代码将成百上千。

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

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

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

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

4

3 回答 3

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);
}
于 2013-01-18T22:41:27.563 回答
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]();
}
于 2013-01-18T22:30:48.280 回答
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

于 2013-01-18T22:38:50.110 回答