Я бы начал с моделирования интересных операций. В конечном итоге вы подключите их к пользовательскому интерфейсу, но это руль и педаль газа, а не двигатель.
То, что вы пытаетесь построить, имеет много общего с языками программирования: переменными, значениями, типами, выражениями, оценкой и т. Д. Многие из метафор применимы и могут служить руководством.
Если вы используете .NET 3.5, у вас есть опция Деревья выражений , которые позволяют вам представлять и компилировать выражения кода во время выполнения.
Например, для моделирования вашей первой цели:
using System.Linq.Expressions;
ConstantExpression theNumber2 = Expression.Constant(2);
ConstantExpression theNumber3 = Expression.Constant(3);
BinaryExpression add2And3 = Expression.Add(theNumber2, theNumber3);
Чтобы вызвать выражение, нам нужно обернуть add2And3
методом. Это делается с помощью лямбда-выражения:
Expression<Func<int>> add2And3Lambda = Expression.Lambda<Func<int>>(add2And3);
Func<int>
представляет метод, который не принимает параметров и возвращает int
. В C # код, представленный add2And3Lambda
, будет:
() => 2 + 3
Итак, у нас есть дерево выражений, корнем которого является метод. Поскольку метод callable , мы можем скомпилировать дерево в экземпляр базового типа делегата:
Func<int> add2And3Func = add2And3Lambda.Compile();
Теперь мы можем вызвать созданный нами код:
int theNumber5 = add2And3Func();
Поддерживается каждое выражение, доступное для языков .NET.
Представьте, что с каждым узлом в вашем графике связан Expression
. Это может дать вам представление о силе деревьев выражений и о том, как они могут помочь вам в этой задаче.