Обновить значение вне класса и сохранить его в C #?

#c# #class #variables

#c# #класс #переменные

Вопрос:

Ну, я борюсь с основной проблемой области видимости (на мой взгляд), я хотел бы обновить свое переменное решение извне и сохранить его (в классе CProperties), чтобы передать его в моем словаре, поэтому я сохраняю один и тот же ключ для другого значения.

ps: я должен сохранить формат Dictionary<string, string>() (для Api) (да, я бы предпочел string, string[])

pps: я родом из C

Каков был бы правильный способ сделать это?

 public static class CProperties
{
   public static string solution { get; set; }
            
   static public Dictionary<string, string> product = new Dictionary<string, string>()
   {
       { "product_name", solution}
   };
}
static void mycrazyFunc()
{   
            // I skip the Database connection and everything
            DataTable dt = new DataTable();
            dt.Load(cmd.ExecuteReader());
        
             if (dt.Rows.Count > 0)
             {
                 foreach (DataRow rows in dt.Rows)
                 {
                     dynamic JsonObj = new ExpandoObject();
            
                     if (!string.IsNullOrEmpty(rows["Product"].ToString()))
                     {
                        CProperties.solution = rows["Product"].ToString(); // Got the value !
                        JsonObj.custom_fields = CProperties.product;       // Lost the value ! 
                                                                           // {"product_name", "null"}
                     }
                 }
             }
}
  

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

1. Вы не потеряли значение, оно никогда не помещалось в product . Когда product инициализируется, solution is null ; это то, что попадает в словарь, а не ссылка на solution свойство. Изменение solution не меняется product["product_name"] (во всяком случае, не так, как у вас здесь).

2. Объясните снаружи в вашем случае, вне класса, вне процесса, вне машины, что именно вам нужно предоставить гораздо больше деталей

Ответ №1:

Пусть установщик и получатель читают / записывают в / из самого словаря:

 public static class CProperties
{
   public static string solution 
   { 
     get{ return product["product_name"]; }
     set{ product["product_name"] = value; }
   }
            
   static public Dictionary<string, string> product = new Dictionary<string, string>()
   {
       { "product_name", null}
   };
}
  

или создать словарь по требованию

 public static class CProperties
{
   public static string solution { get; set; }
            
   static public Dictionary<string, string> product => new Dictionary<string, string>()
   {
       { "product_name", solution}
   };
}
  

Любой из них будет работать для вас.


Но все это в стороне, ваш вопрос был

Каков был бы правильный способ сделать это?

Возможно, правильный способ сделать это — CProperties полностью избавиться от него, поскольку он не служит никакой реальной цели и просто устанавливает словарь напрямую:

 JsonObj.custom_fields = new Dictionary<string,string>{ 
       ["product_name"] = rows["Product"].ToString() 
};
  

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

1. Это абсолютно то, что я искал. Поскольку он вызывается из бесконечного цикла, первый вариант выглядит для меня лучше для управления памятью, но, возможно, менее защищен с точки зрения C , lol. Спасибо в любом случае =)

2. @Designart Я не знаю, был ли ваш первоначальный код несколько надуманным, но для меня это выглядит так, как будто CProperties он вообще бесполезен, и вы должны просто установить JsonObj.custom_fields новый словарь. JsonObj.custom_fields = new Dictionary<string,string>{ ["product_name"] = rows["Product"].ToString() };

3. На самом деле да, вы правы. Первоначальная идея заключалась в том, чтобы не дублировать код, поскольку мне приходилось вызывать его из разных методов (вот почему, возможно, это не совсем безопасно, чтобы установить что-то из другого места), чтобы отправить словарь в качестве входных данных в Api. Но в итоге у меня может быть только один метод