AlexXYZ
@AlexXYZ
O Keep Clear O

Получить текстовое представление формулы, записанной в коде, обратно в текст?

Всем привет.

В коде встречается много формул вида (штук 30 и будут пополняться, работа только началась, использование функций не предусмотрено, но может быть всякие мат.формулы типа SQRT, ABS и др):
_Weight_rostv = OTSTUP_SVAYA_MIN_B * 2 + (D_SVAYA + 1000) + D_SVAYA;
_Weight_rostv = OTSTUP_SVAYA_MIN_B * 2 + D_SVAYA * 3 + D_SVAYA;

нужно использовать эти выражения тремя способами
1. Получение результата (то, что и так есть само по себе)
2. Преобразование в строку текста выражения справа от равно (вот прям как в коде записано, можно без пробелов)
3. Идеально - вывод выражения с подстановкой параметров (заменить переменные на их значения).

Последовательность решения не важна, т.е. если можно придумать некий 4-й вариант и из него получать все три - тоже рассматривается.

Возможно ли?
  • Вопрос задан
  • 84 просмотра
Пригласить эксперта
Ответы на вопрос 3
VoidVolker
@VoidVolker Куратор тега C#
Dark side eye. А у нас печеньки! А у вас?
Что-то типа такого:
public static void Main(string[] args)
{
    var cube = new Formula<Func<int, int>>( (x) => x * x, "(x) => x * x" );
    Console.WriteLine(cube.Exec(3));
    Console.WriteLine(cube.Text);
}

public class Formula<T>
{
    public readonly T Exec;
    public readonly string Text;
    public Formula(T action, string text)
    {
        Exec = action;
        Text = text;
    }                    
}
Ответ написан
NeiroNx
@NeiroNx
Программист
Надо рыть в сторону DataBinder.Eval из пакета System.Web.UI:
Ответ написан
@kttotto
пофиг на чем писать
Будет много скобочек, но если такой вариант устроит
static void Main(string[] args)
{
	Expression<Func<double, double, double>> exp = (OTSTUP_SVAYA_MIN_B, D_SVAYA) => (OTSTUP_SVAYA_MIN_B * 2 + D_SVAYA * 3 + D_SVAYA);
	var expBody = ((LambdaExpression)exp).Body.ToString();

	Console.WriteLine(expBody);

	double _OTSTUP_SVAYA_MIN_B = 1;
	double _D_SVAYA = 2;

	var expBodyWithParams = expBody.Replace("OTSTUP_SVAYA_MIN_B", _OTSTUP_SVAYA_MIN_B.ToString()).Replace("D_SVAYA", _D_SVAYA.ToString());

	Console.WriteLine(expBodyWithParams);
	Console.ReadKey();
}


Если грохать лишние скобочки, то дерево expBody надо обходить самостоятельно рекурсивно и строить строку уже на свой вкус.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы