1

要件があります。その中で、次のことを行う必要があります。

  1. コードを動的に生成する
  2. コードを既存の .cs ファイルに書き込む
  3. クラス ファイルの最後の 2 つの中括弧の直前にコードを追加する必要があります。

たとえば、クラスファイルは次のとおりです。

namespace Stackoverflow
{
    public class AskQuestion
    {
        public void Ask()
        {
        }

    //Add the generated code here.
    }
}

次のコードを試しました: クラス FindBraceLocation を作成しました

namespace DBInfo.Class
{
    public class FindBraceLocation
    {
        private int _bracePositionInLine;
        private int _noOfBraceFound;
        private int _lineNoIndex;
        private readonly string[] _fs;

        public int LineNoIndex
        {
            get { return _lineNoIndex; }
            set { _lineNoIndex = value; }
        }

        public int BracePositionInLine
        {
            get { return _bracePositionInLine; }
            set { _bracePositionInLine = value; }
        }

        public int NoOfBraceFound
        {
            get { return _noOfBraceFound; }
            set { _noOfBraceFound = value; }
        }

        public FindBraceLocation(string[] allLines)
        {
            _bracePositionInLine = -1;
            _noOfBraceFound = 0;
            _lineNoIndex = 0;
            _fs = allLines;
        }

        public void SearchFileStringIndex()
        {
            int noOfLines = _fs.Length;
            string line;
            int lineCounter;
            int pos2 = -1;

            for (lineCounter = noOfLines - 1; lineCounter >= 0; lineCounter--)
            {
                line = _fs[lineCounter];
                if (line.Trim().Length == 0)
                {
                    continue;
                }
                pos2 = FindIndexOfBrace(line);
                if (pos2 != -1)
                    break;
            }

            _lineNoIndex = lineCounter;
            _bracePositionInLine = pos2;
        }

        public int FindIndexOfBrace(string line)
        {
            //int braceNo = _noOfBraceFound;

            for (int counter = line.Length - 1; counter >= 0; counter--)
            {
                if (line[counter] == '}' && (++_noOfBraceFound == 2))
                {
                    return counter;
                }
            }
            return -1;
        }
    }

}

そして、次の方法を使用してファイルに書き込みました。

        protected void WriteToExistingGeneratedFile(string strInfo, string strPath)
        {
            string[] allLines = File.ReadAllLines(strPath);
            FindBraceLocation fp = new FindBraceLocation(allLines);
            fp.SearchFileStringIndex();
            string lineForInsertion = allLines[fp.LineNoIndex];
            string tempLine = lineForInsertion.Substring(0, fp.BracePositionInLine) + "\n" + strInfo + "\n" + lineForInsertion.Substring(fp.BracePositionInLine);
            allLines[fp.LineNoIndex] = tempLine;
            File.WriteAllLines(strPath, allLines);

        }
4

2 に答える 2

8

既存のファイルを変更する代わりに、2 番目のファイルを動的に生成し、キーワードを使用してpartial新しいメンバーをクラスに追加します。

静的ファイル:

namespace Stackoverflow
{
    public partial class AskQuestion
    {
        public void Ask()
        {
        }
    }
}

生成されたファイル:

namespace Stackoverflow
{
    partial class AskQuestion
    {
        // Dynamically generated methods and properties
    }
}
于 2013-01-31T19:36:46.327 に答える
0

ストリーム リーダーを使用する場合は、通常の文字列関数を使用できます。次のようなものが機能します。

System.IO.StreamReader myFile =
new System.IO.StreamReader("c:\\test.cs");
string myString = myFile.ReadToEnd();

// This will error if there are not at least 2 parentheses.
string UpToLastParan = myString.Text.Substring(0, myString.LastIndexOf("}"));
int SecondToLast = UpToLastParan.LastIndexOf("}");
string UpToSecondToLastParan = myString.Substring(0, SecondToLast);
string CorrectedString = UpToSecondToLastParan + "Your Code Here" + myString.Substring(SecondToLast, myString.Length - SecondToLast);

// Write back to file.
于 2013-01-31T21:07:32.003 に答える