Вызов нужного поля из класса через параметр метода

Нужно, чтобы переменная result имела значение 5

public class Test : ModuleBase<SocketCommandContext>
    {
        private int v1 { get; set; }
        private int v2 { get; set; }
        private int v3 { get; set; }
        private int v4 { get; set; }

        [Command("tst")]
        public async Task Tst(int ItemId)
        {
            var m = new Test();

            m.v1 = 1;
            m.v2 = 1;
            m.v3 = 1;
            m.v4 = 1;

            int[] nums = new int[] { m.v1, m.v2, m.v3, m.v4 };

            nums[ItemId] = 5;

            var result = m.v3;

            await ReplyAsync($"{result}");
               
        }
    }

Ответы (1 шт):

Автор решения: Alexander Petrov

Судя по вашему решению, вам нужно менять значение свойство. И вы хотите при вызове метода как-то задать, какое именно свойство.

Можно определить метод следующим образом:

public async Task PutUpForSale(Action<InventoryUser> action)
{
    var invUser = InventoryUserDb.GetInventoryUser(Context.User.Id, Context.Guild.Id);

    action(invUser);

    await InventoryUserDb.SetInventoryUser(invUser);
}

Желаемая операция передаётся в виде делегата.
Использование:

await PutUpForSale(user => user.Bucket -= quantity);

Достоинство: вместо номера свойства (которое может измениться при добавлении новых или удалении старых свойств) указывается непосредственно его имя.

Недостаток: можно по ошибке задать неверную операцию. Например: user.Bucket *= quantity - умножение вместо вычитания.


Предложу ещё одно решение.

Используем структуру с явным размещением полей. И буфер фиксированного размера.

При этом необходимо разрешить небезопасный код.

[StructLayout(LayoutKind.Explicit)]
public struct Test
{
    [FieldOffset(0)] private int v1;
    [FieldOffset(4)] private int v2;
    [FieldOffset(8)] private int v3;
    [FieldOffset(12)] private int v4;

    [FieldOffset(0)] private unsafe fixed int vs[4];

    public void Tst(int itemId)
    {
        var m = new Test();

        m.v1 = 1;
        m.v2 = 1;
        m.v3 = 1;
        m.v4 = 1;

        unsafe
        {
            m.vs[itemId] = 5;
        }

        int result = m.v3;
        Console.WriteLine(result);
    }
}

Достоинства: работает быстро, нет лишнего расхода памяти.

Недостатки: нельзя использовать класс, необходим unsafe.

→ Ссылка