找出函数内部使用的变量

本文关键字:变量 内部 函数 | 更新日期: 2023-09-27 18:29:08

我正在用C#编写一个开源工程计算器应用程序。

有一个名为CalcVar的类,它表示单个计算器变量。它们被添加到Calculator类中。在构造这个CalcVar变量时,它被传递一个"等式"lambda函数(类型为Func<double>,如下所示),其主体可以包含任意数量的CalcVar对象(它们也属于同一个Calculator类),这些对象被相乘/相加/除法/无论什么,并返回这个CalcVar对象的值。

例如

class OhmsLaw : Calculator
{
    CalcVar voltage;
    CalcVar current;
    CalcVar resistance;
    public OhmsLaw() : base("Ohm's Law", "Ohm's law calculator.")
    {           
        this.voltage = new CalcVar(() => current.RawVal*resistance.RawVal);
        this.current = new CalcVar(() => voltage.RawVal / resistance.RawVal);
        this.resistance = new CalcVar(() => voltage.RawVal / current.RawVal);
    }
}

我希望能够以某种方式计算出在给定的CalcVarequation函数中使用了哪些其他CalcVar变量,这样我就可以计算出变量的依赖关系。

我该怎么做?当访问CalcVarRawVal时,我觉得我需要发出一个事件或类似的事件,并以某种方式让有问题的CalcVar订阅这些事件,并在调用equation.Invoke()时记录哪些事件被触发。

找出函数内部使用的变量

您可能希望CalcVar接受表达式树而不是lambda
例如

Expression<Func<double>>

而不是

Func<double>

这样,您就可以在CalcVar中检查表达式树的主体,并查看依赖项是什么。你可以在这里查找表达式树的介绍:

什么是表达式树,你如何使用它们,为什么要使用它们?