Golden Basim Ответов: 3

Как объединить путь к классу с именем переменной внутри него и показать ее значение?


привет,
У меня занятия "Вар"в папке в моем проекте вроде Мой проект.Модели.Варс.
и этот класс содержит некоторые статическая переменная

class Vars
{
        public static string var1= "value1";
        public static string var2= "value2";
        public static string var3= "value3";
        public static string var4= "value4";
}


В другой папке Мой проект.Формы.Mis у меня есть форма форма 1 это содержит текстовое поле. когда пользователь пишет в этом текстовом поле Имя var ex:- вар1
как показать его значение (value1)

Что я уже пробовал:

я искал, но не знаю, о чем я могу искать.

есть любое решение для объединения пути класса "Мой проект.Модели.Варс- с именем ВАР "Вар- и показать его ценность

3 Ответов

Рейтинг:
2

BillWoodruff

using System;
using System.Collections.Generic;

namespace MyProject
{
    public class Models
    {
        public static class Vars
        {
            public static readonly Dictionary<string, string> VarToValue = new Dictionary<string, string>
            {
                {"var1", "value1"},
                {"var2", "value2"},
                {"var3", "value3"},
                {"var4", "value4"}
            };

            public static string GetValueFromVar(string svar)
            {
                if (VarToValue.ContainsKey(svar))
                {
                    return VarToValue[svar];
                }

                throw new ArgumentException($"{svar} is not a valid  key");
            }
        }
    }
}
Значение любой переменной в 'Vars теперь можно получить из любого места пространства имен' MyProject:

строка test1 = MyProject.Models.Vars.GetValueFromVar("var1");


Golden Basim

да, это в том случае, если я знаю, что такое переменная, которую пользователь будет называть. пользователь будет писать только имя переменной в текстовом поле.text = var1

BillWoodruff

см. пересмотренный ответ

Golden Basim

Да, я думал об этом раньше, но эта переменная уже была вызвана во многих других местах. но все же ваше решение-лучшее для новых проектов. спасибо

Richard Deeming

Словарь делегатов будет работать для вашего существующего кода.

Golden Basim

этот класс содержит линии 4000 может быть 80-100 вар, вар имя-это имя запроса, значение VAR является экс текста запроса :-
// получить количество недостач
публичная статическая строка getItems_Shortages_Count_QUERY = @"
Создайте процедуру `getItemsShortagesCount`(в searchVar varchar(200))
НАЧАТЬ
Выберите * из st_items s, st_plug_manufacturer m, где stitems_Name, например CONCAT('%', searchVar , '%') или
s.stitems_Pharma_ActiveIngredient как CONCAT('%', searchVar , '%') или
m.manu_Name, например CONCAT('%', searchVar , '%') или
s.stitems_Code =searchVar;
КОНЕЦ ";

Рейтинг:
1

Richard Deeming

Вариант ответа Билла, который будет работать с вашими существующими полями и все равно должен быть быстрее, чем отражение:

static class Vars
{
    public static string var1= "value1";
    public static string var2= "value2";
    public static string var3= "value3";
    public static string var4= "value4";
    
    private static readonly IReadOnlyDictionary<string, Func<string>> Map = new Dictionary<string, Func<string>>(StringComparer.OrdinalIgnoreCase)
    {
        [nameof(var1)] = () => var1,
        [nameof(var2)] = () => var2,
        [nameof(var3)] = () => var3,
        [nameof(var4)] = () => var4,
    };
    
    public static string GetValueFromVar(string varName)
    {
        if (string.IsNullOrEmpty(varName)) throw new ArgumentNullException(nameof(varName));
        if (!Map.TryGetValue(varName, out var fn)) throw new ArgumentException($"'{varName}' is not a valid key.", nameof(varName));
        return fn();
    }
}


Рейтинг:
1

Golden Basim

я использовал отражение

FieldInfo fld = typeof(Vars).GetField("var1");
string val = fld.GetValue(null).ToString();


BillWoodruff

почему вы используете такие дорогие (рефлексивные) методы, когда есть простые решения ?