Если вам нужны Blocks [5] .Properties, а также Blocks.Rock.Properties, Blocks должен быть пользовательским классом с индексатором. Настройка аналогична операции:
public Block this[] (int index)
{
//getter logic here
}
Индексаторы могут принимать целочисленные типы или строки, поэтому вы можете использовать блоки для переноса словаря и доступа к значениям по ключу: Blocks["Rock"].Properties
. Это включает в себя «волшебные строки», которые компилятор не будет ловить, если вы ошиблись.
Именованные геттеры - это простые свойства только для чтения:
public Block Rock { get{//getter logic here} }
Если бы это было мое приложение, я бы создал одноэлементный класс Blocks. Блоки являются неотъемлемой частью игры, используются на протяжении всей ее жизни, и вы не хотите явно их создавать; определение одноэлементного сценария (и его легче заменить на экземпляр с нормальной областью действия, чем если бы он был статичным). Этот класс Blocks обернет коллекцию объектов Block, а затем эта реализация будет скрыта за средствами доступа Blocks. Вы можете использовать список и искать их свойства с помощью Linq (я предполагаю, что свойства блока будут включать BlockID, а также его имя), или вы можете выбрать индекс или имя блока в качестве ключа словаря Блоки.