c# - 以编程方式在方法体结束前插入代码行

标签 c# file-io unity3d post-processing

我想做的是以编程方式插入一行代码(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 脚本。有些东西需要在每次新构建后手动添加(我想自动添加,以尽量减少可能出错/忘记的东西的数量)。

编辑

显然我还不够清楚。 上面的代码只是一个示例的意思,它看起来不会和上面的代码示例完全一样。可能有也可能没有开关盒。可能会有额外的 {} 字符(尽管始终会有匹配的开始和结束括号)。没有“占位符”,这意味着没有我可以找到并替换的“<--------INSERT CODE HERE -------->”。如果事情有那么简单,我就不会寻求帮助了!抱歉,如果我不清楚,但老实说,我认为我提供了足够的信息。

最佳答案

给定一些限制:

  1. 该类不包含带左/右大括号的字符串文字。
  2. 您需要插入该行的方法始终位于大括号嵌套的第 2 层。
  3. 您需要在所有此类方法中插入该行。
  4. 也许还有一些其他限制条件?

你可以像我刚才用 JavaScript 写的那样写一个简单的程序:

var str = '{test{test2{test3}{test4}}{test5}}';

var stack = [];

var result = '';
for (var i = 0, len = str.length; i < len; i++) {
    var chr = str[i];
    var resChr = chr;
    if(chr == '{') {
        stack.push(chr);
    }
    if (chr == '}') {
        stack.pop();

        if (stack.length == 1) {
            resChr = 'your line;' + chr;
        }
    }

    result += resChr;
}

console.log(result);

JsFiddle https://jsfiddle.net/dus2jj63/

结果会是

{test{test2{test3}{test4}your line;}{test5your line;}}

代码可能看起来很丑,你可以在这里做很多优化。如果您需要查找具有特定名称的方法,您还可以添加简单的调整。

附言首先尝试用正则表达式解决它,但结果并不是那么容易。

附言另一个带有您提供的示例的 JsFiddle https://jsfiddle.net/xhezcg7a/

关于c# - 以编程方式在方法体结束前插入代码行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30108792/

相关文章:

c - C 中未读取整个文件(意外出现 EOF)

file-io - 删除目录vb6内的所有文件

c# - NHibernate QueryOver RowCount,区分 0 和 NULL

c# - Xaml TextBlock 设置圆角

c# - 当 DropDownList Filter 的值不是 ALL 时,如何删除 GridView 中的整个第一列?

android - GvrVideoPlayer.cs 错误阻止我编译应用程序。我所做的就是导入 GVR sdk!我怎样才能解决这个问题?

c# - 在具有不同坐标轴的系统之间转换欧拉角(Unity 和 Threejs)

c# - 以编程方式选择 DataGridView 的一行

c# - File.Copy 和 File.Move 的区别

c# - 输入.GetButtonDown ("Jump");在 Unity 中不适用于空格键