Десериализатор C # json как установить свойство

#c# #json #properties

#c# #json #свойства

Вопрос:

Мой код:

 namespace RTT_API
{
    class routepoint
    {
        public string description { get; set; }
        public string TIPLOC { get { return TIPLOC; } set { SetStationRef(); } }
        public string publicTime { get; set; }
        public Guid StationRef { get; set; }
       
        public void SetStationRef()
        {
            SqlCommand comStationRef = new SqlCommand("select uniqueref from station where tiploc=@tiploc", Globals.RTTConn);
            comStationRef.Parameters.Add("@tiploc");
            comStationRef.Parameters["@tiploc"].Value = TIPLOC;
            SqlDataReader rdrStationRef = comStationRef.ExecuteReader();

            if (rdrStationRef.HasRows == true)
            {
                rdrStationRef.Read();
                StationRef = rdrStationRef.GetGuid(1);
                rdrStationRef.Close();
            }
            else
            {
                rdrStationRef.Close();
                comStationRef.CommandText="Insert into station(tiploc) values (@tiploc)";
                comStationRef.ExecuteNonQuery();
            }

            rdrStationRef.Close();
        }
    }
}
 

Я был бы признателен за помощь в следующем:

  • Если я пытаюсь отладить значение TIPLOC, я получаю ошибку Stackoverflow. Он работал нормально, когда определение было только:
 public string TIPLOC { get; set; }
 
  • SetStationRef Метод не запускается, когда значение установлено
  • TIPLOC Значение устанавливается командой десериализации JSON. Является ли использование пользовательского метода set правильным способом установки StationRef значения? Я попытался поместить код в конструктор класса, но похоже, что конструктор запускается до того, как десериализация JSON установит свойства? Я новичок в C #, поэтому стараюсь не вдаваться в какие-либо плохие практики для начала.

Спасибо

Ответ №1:

Эта строка public string TIPLOC { get { return TIPLOC; } set { SetStationRef(); } } будет возвращать TIPLOC бесконечно, потому что она вызывает саму себя. Вызов return TIPLOC вызовет средство получения TIPLOC, и оно будет продолжать делать это до тех пор, пока не переполнит стек. При отладке отладчик попытается получить значение свойства и застрянет в этом цикле.

set { SetStationRef(); } также игнорирует значение. Я предполагаю, что вы хотите позвонить SetStationRef(value); . В установщике свойства значение, которое пытается установить пользователь, передается как локальная переменная с именем value

Судя по общему виду, я думаю, что вы пытаетесь достичь чего-то вроде

 private string tiploc; 
public string TIPLOC
{
   get 
   {
       if(tiploc == null)
       {
           tiplock = GetValueFromDatabase(); // Replace this to retrieve the value
       }

       tiploc;
   }
   set 
   {
        SetStationRef(value);
        tiploc = value;
   }
}
 

Комментарии:

1. Спасибо за вашу помощь. Теперь я понимаю, почему я получаю ошибку Stackoverflow. Процесс, который я пытаюсь настроить, является частью 1) Строка TIPLOC задается JSON (я могу заставить ее работать самостоятельно, я прерываю ее при попытке часть 2. Часть 2) Когда TIPLOC установлен, выполняется некоторый код, который получает StationRef из SQLбаза данных и сохраняет ее в свойстве StationRef . То, чего я пытаюсь избежать: а) Повторный запрос базы данных для StationRef б) Автоматическое установление StationRef при установке TIPLOC, чтобы избежать возможности установки одного без другого.

2. Совсем не проблема, можете ли вы принять ответ, если он вам помог, спасибо?

3. Я новичок в Stackoverflow и не уверен во всех процессах. Я все еще работаю над частью 2 (из моего комментария). Это может привести к тому, что мне потребуется обновить мой вопрос и другие ответы. Я пытался спросить в Meta о процессах, но на данный момент это мне не позволяет. Я не хочу неправильно потерять кредит, причитающийся вам за вашу помощь, или закрыть вопрос слишком рано.

4. Не проблема 🙂 Я обновил свой ответ, чтобы избежать повторных запросов.

Ответ №2:

Мои первоначальные три вопроса были:

  1. Если я пытаюсь отладить значение TIPLOC, я получаю ошибку Stackoverflow
  2. Метод SetStationRef не запускается при установке значения —
  3. Значение TIPLOC устанавливается командой десериализации JSON. Является ли использование пользовательского метода «set» правильным способом установки значения StationRef? Я попытался поместить код в конструктор класса, но похоже, что конструктор запускается до того, как десериализация JSON установит свойства? Я новичок в C #, поэтому стараюсь не вдаваться в какие-либо плохие практики для начала.

Бен ответил на вопрос 1, и его помощь позволила мне найти решение вопросов 2 и 3, поэтому ему принадлежит большая заслуга.

Я добавил отдельный ответ только потому, что пользовательский метод доступа должен быть определен в StationRef, а не в Tiploc (Tiploc устанавливается кодом десериализации) следующим образом:

 public string tiploc { get; set; }
        public Guid StationRef

        {
            get
            {
                if (stationRef == Guid.Empty)
                {
                    stationRef = Globals.GetStationRef(tiploc); 
                }
                return stationRef;
            }
            set
            {
                stationRef = value;
            }
        }