4

私がしたいのは、プログラムでコード行を挿入することです ( C#、既存のファイルを開いてそれに書き込むことを意味します) (以下を参照):

私はMyClass.csを持っています:

public class MyClass
{
  public void HelloWorld()
  {
    //hello world
    switch(somevalue)
    {
      case derp:
      //do something here
      break;
    }
    <--------INSERT CODE HERE -------->
  }
}

これを行うための最良のアプローチは何ですか?メソッド「HelloWorld」を見つけてから、「一致する」閉じ括弧 ( } ) を見つけるにはどうすればよいですか?

多くの人は、なぜ私がこれを望んでいるのか疑問に思うでしょう (ちょっとばかげているように思えるからです)。Windows ストア アプリのビルド時に Unity 用の PostProcess スクリプトを作成しているため、これが必要です。また、新しいビルドのたびに手動で追加する必要があるものもあります (これを自動的に作成して、失敗したり忘れたりする可能性のあるものの量を最小限に抑えたいと考えています)。

編集

どうやら私は十分に明確ではありませんでした。上記のコードは単なるであり、上記のコード例とまったく同じにはなりません。スイッチケースがある場合とない場合があります。追加{の and}文字が存在する場合があります (ただし、一致する開始ブラケットと終了ブラケットは常に存在します)。「プレースホルダー」はありません。つまり、見つけて置き換えるだけの「 <--------INSERT CODE HERE --------> 」がありません。物事がそんなに簡単なら、私は助けを求めません! 不確かな場合は申し訳ありませんが、正直なところ、十分な情報を提供したと思いました。

4

4 に答える 4

0

ここでは、確かな答えを得るのに十分な情報を提供していません。

最も簡単な方法は、 「<--------INSERT CODE HERE -------->」テキストを挿入したいものstring.Replaceに置き換えるために使用することです。

しかし、変更しているファイルにそのテキストが実際に表示されるかどうかは完全には明らかではありません。

最後に、既知のマーカーなしでメソッドの最後を本当に見つける必要がある場合は、メソッドとその終了場所を識別するために、はるかに複雑なパーサーが必要になります。それは実行可能ですが、主要なタスクであり、stackoverflow の回答の範囲をはるかに超えています。

于 2015-05-07T18:31:38.560 に答える
0

私はなんとか「機能する」ソリューションをつなぎ合わせることができました。medvedev1088 が言及しているいくつかの欠陥があります。それはおそらく最適化される可能性があります。以下のコードを使用してlineNumber. 見つかった量が{見つかった量と一致する場合}、'}' の使用が何らかのテキスト コンテキストで発生しなかったと仮定すると、メソッドの最後が検出されているはずです。

それから私はStreamWriterすべて同じ行を書いていました。の場合は、閉じ括弧( )lineNumberと書きます。the-code-i-wanna-insert}

private static int FindEndOfMethod(string filename, string methodToFind)
{
    int countStartBracket = 0;
    int countEndBracket = 0;

    string line = "";
    int lineNumber = -1;

    bool foundEnd = false;
    bool foundMethod = false;

    System.Action countBrackets = () =>
    {
        if (line.Contains("{"))
            countStartBracket++;
        if (line.Contains("}"))
            countEndBracket++;

        //If we found the method and the start and end bracke- count is the same we found the end (and they are not zero)
        if (foundMethod && countStartBracket == countEndBracket && countStartBracket != 0 && countEndBracket != 0)
            foundEnd = true;
    };


    //Pass the file path and file name to the StreamReader constructor
    using (StreamReader sr = new StreamReader(filename))
    {
        //Continue to read until you reach end of file
        while (line != null)
        {
            lineNumber++;

            //Read next line, if it's null, we reached end of file and didn't find the place
            if ((line = sr.ReadLine()) == null)
                return -1;

            //If we haven't found the method yet, we check each line to see if it's on this line
            if (!foundMethod)
                if (line.Contains(methodToFind))
                    foundMethod = true;

            //If it was or has been found we count brackets to determine the closing one
            if (foundMethod)
                countBrackets();

            if (foundEnd)
            {
                Debug.Log(lineNumber);
                return lineNumber;
            }
        }
        return -1;
    }
}
于 2015-05-07T21:17:39.980 に答える