Передать переменную. Общий код.

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
Всем привет!

Подскажите, как можно передать в общем коде саму переменную, вместо её значения.

C#:
// В общем коде имеем два класса. Код, как пример логики.

// Класс в котором есть переменная myVariable
public class myClass
{
    public string myVariable { get; set; }
}

// Класс с void'ом
public class someClass
{
    public static void Rd (IZennoPosterProjectModel project, string dt)
    {
        // Делаем действия, в которых необходимо присвоить нашей переменной project.myClass.myVariable, значение "123"
        dt = "123";
    }
}
C#:
// Вызов из кубика

someClass.Rd(project, project.myClass.myVariable);

// Мне необходимо, чтобы на выходе project.myClass.myVariable было со значением "123"
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
я правильно понял что надо установить значение переменной в другом классе и что бы она была видна во всем общем коде ?
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
я правильно понял что надо установить значение переменной в другом классе и что бы она была видна во всем общем коде ?
Все верно, переменная видна в общем коде. Необходимо понимание, как её передать, чтобы присвоить ей новое значение.
 

Koqpe

Client
Регистрация
23.12.2014
Сообщения
1 100
Благодарностей
649
Баллы
113
Если так?
C#:
    public class Variables

    {
        public string myVariable { get; set; }

        public Variables (IZennoPosterProjectModel project, Instance instance)

        {       
             myVariable = project.Variables["myVariable"].Value;
        }
    }
// И в проекте или в рабочем потоке:
Variables = new Variables(this);
 
  • Спасибо
Реакции: RoyalBank

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
наверно надо добавить [ThreadStatic] иначе она не будет общей.
я у себя придерживаюсь правила что все переменные внутри класса должны выставляться классовыми процедурами.

C#:
        public static Point Get_Start_Cursor_Pos(){
              return new Point(CurrentX,CurrentY);
        }

        public static void Set_Start_Cursor_Pos(int X, int Y , IZennoPosterProjectModel project_ = null ){
            if (project_ == null ) project_=project;
              CurrentX = X;
              CurrentY = Y; 
            Save_Start_Cursor_Pos(project_);
        }
и в другом классе вызываю myClass.Get_Start_Cursor_Pos() или myClass.Set_Start_Cursor_Pos(x,y);

до кучи еще в contex проекта сохраняю эти переменные. ну только начал юзать контекст, до последнего обновления [ThreadStatic] обходился
[ThreadStatic] public static int CurrentX =-1;
[ThreadStatic] public static int CurrentY =-1;
[ThreadStatic] public static IZennoPosterProjectModel project;
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
Почти, на вашем примере покажу, что нужно.


C#:
public class Variables
{

    public Instance instance { get; set; }
    public IZennoPosterProjectModel project { get; set; }
 
    public myClass myClass { get; set; }
 
    public Variables (IZennoPosterProjectModel Project, Instance Instance){
        instance = Instance;
        project = Project;
        myClass = new myClass(this);
    }
}

public class myClass
{
    public string myVariable { get; set; }
    public myClass (Variables v)
    {
        myVariable = string.Empty;
    }
}

public class someClass
{
    public static void Rd (v, string dt)
    {
        // Делаем действия, в которых необходимо присвоить нашей переменной project.myClass.myVariable, значение "123"
        dt = "123";
    }
    public someClass (Variables v) {}
}

// И в проекте или в рабочем потоке :
Variables v = new Variables(instance,project);
someClass.Rd(v, v.myClass.myVariable);
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
а понял, вам надо просто передать ссылку на объект. и по ссылке провести изменения.
ссылка передается как ref .
someClass.Rd(project, ref v.myClass.myVariable);
щас гляну как принимать ссылки в процедуре, а то не помню так сразу.
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
а понял, вам надо просто передать ссылку на объект. и по ссылке провести изменения.
ссылка передается как ref .
someClass.Rd(project, ref v.myClass.myVariable);
щас гляну как принимать ссылки в процедуре, а то не помню так сразу.
Да, вроде того, я возился с ref, но так и не смог завести... Опыт не вывозит :(
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
вот так процедурка выглядит приема объекта по ссылке
C#:
    static void ChangePerson(ref Person person)
    {
        // сработает
        person.name = "Alice";
        // сработает
        person = new Person { name = "Bill", age = 45 };
    }
вот так вызывается
C#:
        Person p = new Person { name = "Tom", age=23 };
        ChangePerson(ref p);
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
если применить на ваш пример
C#:
public class someClass
{
    public static void Rd (ref Variables v, ref Variables.myClass.myVariable dt)
    {
        // Делаем действия, в которых необходимо присвоить нашей переменной project.myClass.myVariable, значение "123"
        dt = "123";
    }
}

// И в проекте или в рабочем потоке :
Variables v = new Variables(instance,project);
someClass.Rd(ref v, ref v.myClass.myVariable);
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
ну попробуйте... у себя не проверял.
если надо больше инфы, то я отсюда по структуре данных инфу черпаю.
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
если надо больше инфы, то я отсюда по структуре данных инфу черпаю.
Логика понятна, но "ref Variables.myClass.myVariable dt" работать не будет, я уже был по этой ссылке сегодня, гугл тоже не выручил.

В объявленном войде это условное значение "ref Variables.myClass.myVariable dt", должно быть универсальным, чтобы в него можно было передать любую переменную, а не только конкретную, если только под конкретную, то проще присвоить внутри войда v.myClass.myVariable = "123";
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Логика понятна, но "ref Variables.myClass.myVariable dt" работать не будет, я уже был по этой ссылке сегодня, гугл тоже не выручил.

В объявленном войде это условное значение "ref Variables.myClass.myVariable dt", должно быть универсальным, чтобы в него можно было передать любую переменную, а не только конкретную, если только под конкретную, то проще присвоить внутри войда v.myClass.myVariable = "123";
но С# классовый язык. передать то можно любой объект просто как object , но что бы работать с ним все равно его надо привести в нужный класс.
C#:
        private static void _Main(object obj) 
        {
            For_Draw p1 = (For_Draw)obj;
}
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
вот такой вариант попробовал. работает. можно развивать тему :-)

в общем коде такая конструкция
C#:
namespace ZennoLab.OwnCode
{
    public class Test_Class
    {
        public int x;   
    }
    
    
    public class CommonCode
    {
        
        public static void test ( ref int obj )
        {
            obj = 10;
        }
в кубике такая
C#:
Test_Class p = new Test_Class { x=20 };
project.SendInfoToLog(p.x.ToString());
CommonCode.test( ref p.x); 
project.SendInfoToLog(p.x.ToString());
на выходе
55427



узкое место то что передаваемый объект все равно надо приводить к какому нибудь типу. я выбрал int. ну и передача ссылки была удачна и в созданном объекте в кубике прошли изменения вызванные в процедуре test
 
  • Спасибо
Реакции: RoyalBank

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
вот такой вариант попробовал. работает. можно развивать тему
Пока единственное рабочее, что пришло на ум, это объявлять public static string и возвращать через return получаемое значение.
А в кубике присваивать v.myClass.myVariable = someClass.Rd(v);
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Пока единственное рабочее, что пришло на ум, это объявлять public static string и возвращать через return получаемое значение.
А в кубике присваивать v.myClass.myVariable = someClass.Rd(v);
если подходить чисто с меркатильной точки зрения, а не акдемической :ce: , то самый простой способ это общие данные хранить в контексте проекта.
считал объект из контекста
изменил объект
записал в контекст.
ляпота :-)
 
  • Спасибо
Реакции: devffy, RoyalBank и Koqpe

Koqpe

Client
Регистрация
23.12.2014
Сообщения
1 100
Благодарностей
649
Баллы
113
если подходить чисто с меркатильной точки зрения, а не акдемической :ce: , то самый простой способ это общие данные хранить в контексте проекта.
считал объект из контекста
изменил объект
записал в контекст.
Еще бы контекст в зенке отрабатывал как положено :ce:
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Еще бы контекст в зенке отрабатывал как положено :ce:
а что с ним не так ? я там пока 2 переменные определил жить. не критичные для проекта. чего от контекста можно ожидать ?
 

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
Подскажите, как можно передать в общем коде саму переменную, вместо её значения.
Первый вопрос который надо задать самому себе, какого типа переменная, ссылочного или значимого.
Если значимого, то через ref или out, если ссылочного, то вообще проблем нет.

Но судя по коду дальше, дело не совсем в этом.))
Если именно как код дальше, то ответ - никак.
Единственный вариант - это статик переменная.

В объявленном войде это условное значение "ref Variables.myClass.myVariable dt", должно быть универсальным, чтобы в него можно было передать любую переменную
Тогда делаешь статик переменную типа object, но потом придется делать приведение к нужному типу, о чем собственно писали выше.
Если через статик переменную, то надо использовать атрибут ThreadStatic. Тогда для каждого потока эта переменная будет уникальна. Если без этого атрибута, то тогда эта переменная будет одна на все потоки шаба.

В общем то задача понятна. Надо каким то макаром обмениваться данными между кубиками.
И тут два варинта.
project.Context.
статик переменная/св-во с атрибутом ThreadStatic. В последнем релизе там косяк с этим, сказали поправят в следующем.
Других вариантов нет.
 
  • Спасибо
Реакции: zortexx, doc и RoyalBank

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
Других вариантов нет.
Спасибо, за развернутый ответ.
ThreadStatic пока не довелось использовать, буду изучать это направление, для возможного применения в шаблонах.
 

Koqpe

Client
Регистрация
23.12.2014
Сообщения
1 100
Благодарностей
649
Баллы
113
а что с ним не так ? я там пока 2 переменные определил жить. не критичные для проекта. чего от контекста можно ожидать ?
Держал в контексте переменные соединения с БД и передавал их из кубика в кубик:
C#:
string db_host = "localhost";     // хост
string db_user = "root";          // username для подключения к MySQL
string db_pswd = "";              // пароль для подключения к MySQL
string db_database = "mydb";      // название БД с которой будет работа
string db_charset = "utf8";       // кодировка данных в таблицах

DB db = new DB(db_host, db_user, db_pswd, db_database, db_charset);

// сохраняем объект в контексте что бы использовать его в других кубиках
project.Context["db"] = db;
очень часто сыпались ошибки по подключению к базе, стал прописывать данные в каждом кубике ошибки пропали. Теперь контекст не использую.

P.S. Версию зенки не помню, где-то во время выхода этой статьи...
 

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)