Вызов нужного поля из класса через параметр метода
Нужно, чтобы переменная 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 шт):
Судя по вашему решению, вам нужно менять значение свойство. И вы хотите при вызове метода как-то задать, какое именно свойство.
Можно определить метод следующим образом:
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.