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

104
10 мая 2021, 14:20
object b = new Button();
b.GlueValue(567);
/////
int value = b.GetValue();
Answer 1

У класса Button в WinForms есть свойство Tag типа данных object. Туда можно положить все что хочешь. И потом при клике делать, напрмер:

var btn = sender as Button
var btnProperty = btn.Tag as T // где T - желаемый тип
Answer 2

Используйте возможности ООП. Создайте класс кнопки со значением:

public class ValueButton : Button
{
    private int _value;
    public void SetValue(int value)
    {
        _value = value;
    }
    public int GetValue()
    {
        return _value;
    }
}

При желании, можно создать любое количество свойств/полей любого типа.

Другой вариант. Используем методы расширения.

public static class Extensions
{
    public static void SetValue(this Control control, int value)
    {
        control.Tag = value;
    }
    public static int GetValue(this Control control)
    {
        return (int)control.Tag;
    }
}

Теперь у любого объекта типа Control (а это все gui-объекты WinForms) есть методы сохранения-получения значения. Но для хранения используется свойство Tag, что ограничивает нас одним значением (можно при желании коллекции использовать).

Следующий способ добавляет методы расширения к типу object, то есть ко всем типам.

public static class Extensions
{
    static Dictionary<object, int> dict = new Dictionary<object, int>();
    public static void SetValue(this object @object, int value)
    {
        if (dict.ContainsKey(@object))
            dict[@object] = value;
        else
            dict.Add(@object, value);
    }
    public static int GetValue(this object @object)
    {
        if (dict.TryGetValue(@object, out int value))
            return value;
        else
            return default(int);
    }
}

Естественно, это правильно работает только со ссылочными типами.
Для значимых типов и ссылочных типов, копируемых по значению (например, string), value будет добавляться именно к значению, а не к переменной.

READ ALSO
Сериализация IEnumerable в котором ICollection

Сериализация IEnumerable в котором ICollection

У меня есть веб-приложение в котором я отображаются некоторые данные, я хочу с бд выгрузить данные в xml

146
PyMySQL как сделать insert?

PyMySQL как сделать insert?

Вот код моего парсера

109
поиск со стеммером

поиск со стеммером

вопрос в тормозах при нескольких словах одновременно

110
Как объединить (просуммировать) данные в столбце по id?

Как объединить (просуммировать) данные в столбце по id?

У меня есть таблица со следующими данными:

91