Как выразить функторы в C #?

Я перевожу приложение с C ++ на .NET / C #. Однако я борюсь за то, как выразить функторы C ++ в C #.

Как лучше всего перевести следующее выражение на C #?

struct AircraftMover
{
AircraftMover(float vx, float vy)
: velocity(vx, vy)
{
}

void operator() (Aircraft& aircraft, sf::Time) const
{
aircraft.accelerate(velocity);
}

sf::Vector2f velocity;
};

1

Решение

Замените функтор лямбда-кодом в коде C ++, а затем используйте эквивалентный лямбда-код в коде C #.

Редактировать: Ваш код C ++ из комментариев, модифицированный для использования лямбда-выражений:

void Player::initializeActions() {
const float playerSpeed = 200.f;
mActionBinding[MoveLeft].action =
derivedAction<Aircraft>([=](Aircraft& a, Time) { a.accelerate(Vector2f(-playerSpeed, 0.f)); });
...
}

Эквивалентный код C # будет выглядеть примерно так:

mActionBinding[MoveLeft].action =
new derivedAction<Aircraft>((Aircraft a, Time t) => a.accelerate(new Vector2f(-playerSpeed, 0.f)));
4

Другие решения

Вы можете создать действие как это:

Action<Aircraft, Time> airCraftMover = (a,t) => a.Accelerate(new Velocity(vx, vy));

Затем это можно передать и применить к самолетам по желанию.

Чтобы использовать его на самолете, просто вызовите действие как метод:

airCraftMover(aircraft, time);
0