Любой способ получить определение свойства из самого кода? - PullRequest
0 голосов
/ 02 июня 2018
public abstract class Unit
{
    public abstract List<Move> allowedMoves{get;}
}

public class Javelineer : Unit
{
    public List<Move> allowedMoves =>
        new List<Move> {Move.Impale, Move.JavelinThrow, Move.ShieldBlock};
}

public class Dragon : Unit
{
    public List<Move> allowedMoves =>
        new List<Move> {Move.BreatheFire, Move.Swipe, Move.Bite, Move.Devour, Move.TailBash};
}

X:

Учитывая приведенный выше код, если и как я могу получить разрешенные ходы данного подразделения без необходимости создания нового объекта?

Я знаю, что могуполучить свойство с помощью этого кода:

typeof(Javelineer).GetProperty("allowedMoves")

Но если и как я могу получить определение этого свойства?

Y:

Клиент (веб-браузер)Необходимо отправить на игровой сервер юнит игрока.Это включает в себя тип устройства и перемещения, которые может выполнить это устройство (4 из всех доступных; аналогично Pokemon).

Хотя проверка (конечно) выполняется на сервере, браузер все еще должен получитьсписок доступных типов юнитов и разрешенных ходов.

Чтобы не дублировать код, я бы хотел избежать жесткого кодирования этих данных в Javascript.

Прочитав превосходный SOвопросы и ответы Я думаю, что могу извлечь все доступные модули с кодом, подобным следующему:

Assembly.GetExecutingAssembly().GetTypes().Where(
    type => type.BaseType == typeof(Unit)
).Select(type => type.Name).ToList()

Я бы вызвал этот код при запуске сервера, кэшировал результат и отправлял кэшированный результат каждому подключающемусяклиент, потому что я чувствую, что этот код, вероятно, дорогой для вызова.

Но как я могу получить список разрешенных ходов?

1 Ответ

0 голосов
/ 02 июня 2018

У вас есть несколько вариантов, но TL; DR : создайте экземпляр объекта и прочитайте свойство.

В любом случае, вот некоторые варианты, творческие умы могут быть в состояниичтобы найти еще пару.

  1. Создайте экземпляр, прочитайте свойство.

    Это ваш лучший вариант кода, потому что его будет легко понять, поддерживать, исправление ошибки.

  2. Перепишите код, чтобы упростить обнаружение значений с помощью отражения

    Один из способов сделать это - использовать атрибуты, пометить свойство или объектс легальными ходами. Однако , чтобы избежать ошибки, связанной с тем, что атрибуты выполняют одно, а код - другое, вам, возможно, придется изменить код, чтобы использовать атрибуты, что могло бы сказаться на производительности.

    Кроме того, чтение этих атрибутов, вероятно, создаст гораздо больше объектов, чем ваш исходный объект.

  3. Используйте mono.cecil или некоторую другую библиотеку IL-проверок для декодирования кодаполучения свойства и поиска конструкции этого списка, извлекая значения, добавляемые в список.По сути, вам придется либо просто придумать код этого свойства, чтобы он соответствовал тому, что у вас есть сейчас (и никогда не позволять ему становиться более сложным), либо просто симулировать выполнение кода.

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

Итог, построить экземпляр объекта, прочитать свойство.

...