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

1つの代替手段は、リフレクション(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 に答える