Как можно обращаться к свойству класса, используя его имя, хранящееся в переменной?

Можно ли извлечь имя свойства из переменной так, чтобы затем обратиться к этому свойству динамически? Как это реализовать? <br/> <br/> Пример работы: <br/> <pre><code class="cs">string prop = "money";
MyData.prop++; // MyData.money увеличится на 1.</code></pre> <br/> <br/> P.S. Для уточнения: у класса MyData не существует свойства с именем prop.
  • 11 сентября 2024 г. 15:43
Ответы на вопрос 3
В C# для динамического доступа к свойствам класса, имена которых хранятся в переменных, можно использовать рефлексию. Рефлексия позволяет вам получать информацию о типе на этапе выполнения и взаимодействовать с его членами, включая свойства и методы.

Вот пример, как это можно реализовать в вашем случае:

```csharp
using System;
using System.Reflection;

class MyData
{
    public int money { get; set; } = 0;
}

class Program
{
    static void Main(string[] args)
    {
        MyData myData = new MyData();
        string prop = "money";

        // Получение типа MyData
        Type type = typeof(MyData);
        
        // Получение свойства с именем, хранящимся в переменной prop
        PropertyInfo propertyInfo = type.GetProperty(prop);

        if (propertyInfo != null)
        {
            // Извлечение текущего значения свойства
            int currentValue = (int)propertyInfo.GetValue(myData);
            Console.WriteLine($"Текущее значение money: {currentValue}");

            // Увеличение значения свойства на 1
            propertyInfo.SetValue(myData, currentValue + 1);

            // Печать нового значения для проверки
            Console.WriteLine($"Новое значение money: {propertyInfo.GetValue(myData)}");
        }
        else
        {
            Console.WriteLine($"Свойство с именем {prop} не найдено.");
        }
    }
}
```

### Объяснение кода:

1. Мы создаем класс `MyData`, который содержит свойство `money`.
2. В методе `Main` создаем экземпляр `MyData` и задаем имя свойства, которое хотим изменить (в данном случае — "money").
3. Используем `Type.GetProperty()`, чтобы получить информацию о свойстве, соответствующем имени, хранящемуся в переменной.
4. Проверяем, существует ли такое свойство, а затем получаем его текущее значение с помощью `GetValue()`.
5. Увеличиваем значение свойства на 1 с помощью `SetValue()`.
6. Печатаем новое значение для проверки изменений.

Таким образом, вы можете динамически изменять значения свойств, опираясь на имена, хранящиеся в переменных, используя рефлексию в C#.
Нет, нельзя 

Но есть несколько обходных вариантов:

- ExpandoObject
- Делаешь MyData словарем
Перегрузка индексатора 
public class Foo : Dictionary<string, int>
{
    public new int this[string key]
    {
        get => this.GetValueOrDefault(key);
        set => base[key] = value;
    }
}

Foo f = [];
string k = "key";
Console.WriteLine($"Value not set: {f[k]}");
f[k]++;
Console.WriteLine($"Value ++: {f[k]}");
f[k]++;
Console.WriteLine($"Value ++: {f[k]}");
f[k]--;
Console.WriteLine($"Value --: {f[k]}");

Value not set: 0
Value ++: 1
Value ++: 2
Value --: 1
Похожие вопросы