如何计算可以通过不同方法修改的属性?

时间:2013-09-19 15:38:18

标签: c# .net parsing reflection

我们有一个包含一组属性和方法的类(当然可以调用其他类方法[not attribute methods])。

我们需要创建一个工具,它将类的源代码和一个方法名称作为输入,并且它应该通过方法链上的代码返回可能修改的类属性的列表。例如:

private int a;
private int b;
private int c;

public void M1()
{
    if (a == 2)
    {
        this.M3();
    }
}

public void M2()
{
    a = 3;
    this.M3();
}

public void M3()
{
    if (a == 7)
    {
        b = 1;
    }
    else
    {
        c = 2;
    }
}

在这种情况下,要求M1它应该返回 b c ,要求M2它应该返回 a b < / strong>和 c 并要求M3它应该返回 b c

我不知道在哪里使用它,因为我之前从未解析过代码...提前感谢。

编辑:只是为了清楚,我不需要评估不同的路径,如果我检查M3我总是会说它影响b和c,我只关心可能的变化,而不是真正的变化。< / p>

1 个答案:

答案 0 :(得分:1)

我认为您的工具应该以双重方式运行,第一个查询用于识别在每个方法中分配哪些变量以及在每个方法中调用哪些方法。第二个查询将获取方法名称,并跟踪对其他方法的调用,从随后跟踪的每个方法中编译分配的变量。

要检测对变量的赋值(我建议简化解析中的代码,逐行检查并删除空格),查找赋值运算符('=',但不是'==','* =','+ ='等我认为 - &gt;和其他人也可以分配,MSDN将告诉你完整的可能性,如果你知道它们就尝试正则表达式),那么你需要识别被分配给的变量,即直接在该运算符左侧的变量名(在大多数情况下)。按方法存储这些变量赋值的记录。

要在代码中检测方法调用,您只需在要检查的方法中查找方法名称,然后递归查看第二种方法以查找其他方法等等...您可以执行相同操作上面检测方法调用,然后使用你自己思考的数据结构,循环并以这种方式查找。

最重要的是你必须担心注释掉的代码,但如果这是一个早期阶段的项目,最好不要担心:)