Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/21: Рейтинг темы: голосов - 21, средняя оценка - 5.00
 Аватар для ssementsov
0 / 0 / 1
Регистрация: 02.11.2011
Сообщений: 89

Обратиться к переменной в библиотеке по имени

20.08.2012, 18:31. Показов 4121. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите разобраться с этой библиотекой.

Суть проблемы:

Есть Dictionary<string, double>, где содержаться сведения о переменных, к примеру:
"var1", 100.5
"var2", 200.0
"var3", 20.5

Мне необходимо, что эта библиотека восприняла мои переменные, которые в словаре содержатся. Привожу код, который хотелось бы чтобы заработал:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 public class MyClass
        {            
            public MyClass()
            {
            
            }                                
        }
 
 public static void Main()
        {
            Dictionary<string, double> variables = new Dictionary<string, double>();
            variables.Add("var1", 100.0);
            variables.Add("var2", 200.0);
            variables.Add("var3", 300.0);
            variables.Add("var4", 400.0);
            variables.Add("var5", 500.0);
 
            Evaluator ev = new Evaluator(eParserSyntax.cSharp); 
            ev.AddEnvironmentFunctions(new MyClass()); // вот тут "подключается" класс
                        
            opCode formula = ev.Parse("var5-var1*var2");// тут уже вылетает, т.к. не парсер не знает переменных      
            object res = formula.value;
            string result = Evaluator.ConvertToString(res);
 
            Console.WriteLine(result);
            Console.ReadKey();
        }
Что сказано в документации по этому поводу, так это то, что необходимо описать класс, где будут field, property или Function, затем этот класс подключить к Evaluator`у и можно будет парсить выражения, которые содержат переменные описанные в этом классе:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Public Class class1
        Public field1 As Double = 2.3
 
        Public Function method2() As Double
            Return 3.4
        End Function
 
        Public ReadOnly Property prop3() As Integer
            Get
                Return 4.5
            End Get
        End Property
    End Class
 
 
 
    Dim ev As New Eval3.Evaluator
    ev.AddEnvironmentFunctions(New class1)
    MsgBox(ev.Parse("field1*method2*prop3").value.ToString)
Как мне изменить MyClass, чтобы там появились возможность создавать переменные, которые содержаться в словаре?

Заранее Спасибо.
п.с. если что-то пояснил не четко, то могу уточнить не понятные места.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.08.2012, 18:31
Ответы с готовыми решениями:

Как обратиться к переменной по ее имени?
В runtime необходимо обратиться к переменной, хранящей объект. Имя этой переменной содержится в переменной типа String. Мне нужно...

Обратиться к переменной по имени в строковом представлении
Здравствуйте, подскажите пожалуйста как правильно сделать. Имеем string A1 = text; int B = 1; нужно вытащить text из A1 в...

Как подставляя значение переменной к неполному имени переменной обратиться "куда надо"?
Салют, нужно в циклах обращаться к разным переменным ($b1-$b5), но так ручками писать муторно, задумал подставлять к $b($i) значение...

22
 Аватар для ssementsov
0 / 0 / 1
Регистрация: 02.11.2011
Сообщений: 89
21.08.2012, 13:39  [ТС]
Студворк — интернет-сервис помощи студентам
А я не дочитал последнее предложение, сразу проверять код стал

Добавлено через 20 минут
Зато в таком виде он не может производить операции арифметические( говорит, что Object`ы умножать не умеет. Есть выход делать несколько Dictionary для разных типов данных. Но тогда в строке, которые обрамляю название словаря, надо будет обрамлять каждую переменную своим названием словаря.

Неужели никак проще не сделать?(

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using System;
using System.Collections.Generic;
using System.Text;
using Eval3;
 
namespace TestCSharp
{
    public class MyClass
    {
        public static Dictionary<string, object> variables = new Dictionary<string, object>();
        public MyClass(Dictionary<string, object> var)
        {
            variables = var;           
        }
    }
 
    public class Program 
    {
        public static void Main()
        {
            Dictionary<string, object> variables = new Dictionary<string, object>();
            variables.Add("колоннаКондуктор", true);
            variables.Add("естьПромежуточная", true);
            variables.Add("глубинаСкважины", 4500);
            variables.Add("глубинаСпускаКолонны", 700);
            variables.Add("глубинаПодсоли", 550);
            variables.Add("естьИнтервалОриентирования", false);
 
            Evaluator ev = new Evaluator(eParserSyntax.cSharp);
            ev.AddEnvironmentFunctions(new EvalFunctions());
            ev.AddEnvironmentFunctions(new MyClass(variables));
 
            string stringForParse = "глубинаСпускаКолонны * глубинаСкважины";
            string[] stringSplit = stringForParse.Split("?:*/+-><=.,".ToCharArray());
          
        
            StringBuilder newString = new StringBuilder();
            foreach (string stroka in stringSplit)
            {
                char separator = stringForParse.IndexOf(stroka) + stroka.Length < stringForParse.Length 
                                     ? stringForParse[stringForParse.IndexOf(stroka) + stroka.Length] 
                                     : ' ';
                newString.AppendFormat("variables[\"{0}\"]{1}", stroka.Trim(' '), separator);
            }
 
            opCode formula = ev.Parse(newString.ToString().TrimEnd(' '));            
            object res = formula.value;
            string result = Evaluator.ConvertToString(res);
 
            Console.WriteLine(result);
            Console.ReadKey();
        }       
    }
}
0
310 / 206 / 44
Регистрация: 15.02.2012
Сообщений: 605
21.08.2012, 14:07
Можно попробовать встроить в MyClass такую функцию

C#
1
2
3
4
public static double ConvertVar(string var)
        {
            return Convert.ToDouble(variables[var]);
        }
и использовать ее вместо variables[] там где необходимо. Условий до конца не знаю - трудно ещё что-то добавить. Можете написать перегрузить её в классе для каждого типа данных, а тип забирать из Dictionary, добавив к нему ещё один столбец "тип данных".

Так даже лучше будет - вместо variables[] в строку для парсера всегда будет добавляться ConvertVar(stroka, vartype) а там уже вызовется нужный перегруженный метод и вернет для парсера тип данных, с которым он сможет работать
1
 Аватар для ssementsov
0 / 0 / 1
Регистрация: 02.11.2011
Сообщений: 89
21.08.2012, 14:17  [ТС]
Будем пробовать сейчас)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.08.2012, 14:17
Помогаю со студенческими работами здесь

Обратиться к переменной класса по имени в строковом виде
Добрый день друзья. Пожалуйста подскажите как правильно можно присвоить значение переменой если имя этой переменой заранее не известно. Имя...

Как обратиться к объекту, в частности к JButton, по имени, которое находится в переменной?
Я по определенному алгоритму получаю имя JButton, которых в общем 40 штук, у которой надо изменить свойство. Естественно я получаю имя...

Как обратиться к переменной, если после функции тебе дали строку, с именем переменной
Допустим есть Function Generation():String; там генерируется строка, с именем нашего обьекта(имя объекта мы не знаем которое выпадет). ...

В переменной типа string хранится имя переменной, к которой нужно обратиться. Как это сделать?
Пример: int speed = 10; string s = &quot;speed&quot;; MessageBox.Show(/*как-то обратиться к переменной, чье имя содержится в переменной...

Нюансы синтаксиса: куда прижимать звёздочку при объявлении указателя - к имени типа или к имени переменной?
Скажите, пожалуйста, в чём отличие таких записей: int *px int* px int *px = new int int *px = new int* int* px = new int ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru