#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
isnull
; это то, что попадает в словарь, а не ссылка на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. Но в итоге у меня может быть только один метод