Свойство является пустым, даже будучи установленным в коде

Я думаю, что использование вспомогательной колонки, безусловно, самый простой вариант. Вы можете «спрятать» столбец, чтобы он не мешал. (Щелкните правой кнопкой мыши -> Скрыть столбец).

Но вы можете сделать это с помощью скрипта, используя функцию сравнения! Вот пример реализации. Это слишком многословно в надежде объяснить и адаптировать к вашему конкретному случаю использования.

Code.gs

// get active spreadsheet
var ss = SpreadsheetApp.getActive();

// define mapping of status to custom values
var mapping = {
  Yes: 1,
  No: 2,
  Pending: 3,
  Withdrawn: 4
};

// define range of values to sort & which one is "status"
var sortRange = "A2:B20";
var statusCol = 0;

/**
 * Sort defined range by status, using defined mapping
 * See: https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet
 */
function sortData() {
  // select sheet
  var sheet = ss.getSheets()[0];

  // select range
  var range = sheet.getRange(sortRange);

  // get values (array of arrays)
  var data = range.getValues();
  Logger.log("\ndata pre-sort: %s\n\n", data);

  // sort using custom compare function
  data.sort(sortFcn_);
  Logger.log("\ndata post-sort: %s\n\n", data);

  // write values back to spreadsheet
  range.setValues(data);
}

/**
 * Custom compare function used by sortRange
 * See: https://www.w3schools.com/jsref/jsref_sort.asp
 */
function sortFcn_(rowA, rowB) {
  // get "status" from row (array lookup by integer)
  var aStatus = rowA[statusCol];
  var bStatus = rowB[statusCol];

  // convert status msg to value (object lookup by key)
  var aValue = mapping[aStatus];
  var bValue = mapping[bStatus];

  // sort in ascending order
  return aValue - bValue;
}

Теперь вам просто нужно выяснить, как вызывать «sortData» в нужное время. Для нескольких вариантов см .:

5
задан Bill the Lizard 19 September 2012 в 22:26
поделиться

5 ответов

Ваша проблема с ключевым словом "new". Вот где вы используете его в классе «Use»:

    private string parameters;
    public new string Params
    {
        set { this.parameters = value; }
        get { return this.parameters; }
    }

Вы создаете другое свойство, имя которого совпадает с именем свойства типа, от которого вы наследуете. Ключевое слово «new» сообщает компилятору, что вы намеревались это сделать.

По сути, это означает, что если вы сделаете следующее:

var x = new Use();
x.Params = "abcd";
((ACommand)x).Params = "wxyz";
Console.Writeline("direct: " + x.Params);
Console.Writeline("ACommand: " + ((ACommand)x).Params);

Вы получите следующий вывод:

direct: abcd

ACommand: wxyz

Вы, вероятно, хотите полностью удалить определение «Params» из Use и просто наследовать определение от ACommand. Вероятно, из Имени и Описания, но вы сможете выяснить, хотите ли вы этого или нет.

9
ответ дан 18 December 2019 в 09:53
поделиться

Не видя код для класса ACommand ... Попробуйте удалить оператор "new" в объявлении Params класса Use. Когда вы устанавливаете свойство c.Params = команда; фактически устанавливает свойство базового класса, в методе Execute вы проверяете this.parameters вместо base.Params.

3
ответ дан 18 December 2019 в 09:53
поделиться

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

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

Когда вы ссылаетесь как ACommand:

TextGame.Commands.ACommand c = parser.GetCommand(command);            
c.Params = command;

Вы будете использовать либо параметры ACommand, либо ваши переопределения (если вы имели определен один).

Ваши новые Params затеняют параметры ACommand и доступны только в том случае, если ваша ссылка - UseCommand.

2
ответ дан 18 December 2019 в 09:53
поделиться

Ваша проблема здесь:

private string parameters;
public new string Params
{
    set { this.parameters = value; }
    get { return this.parameters; }
}

В вашем коде:

c.Params = command;

вы ссылаетесь на тип TextGame.Commands.ACommand . Поскольку вы скрываете свойство Param в своем подклассе, вы вызываете неполиморфную ссылку. Удалите приведенное выше определение и положитесь на определение базового класса Param, и все будет в порядке.

2
ответ дан 18 December 2019 в 09:53
поделиться

Прошло много времени с тех пор, как я столкнулся с этой проблемой, но если вы откроете это в Reflector, я ожидаю, что вы увидите, что скрываете свойство Use.Params за callvirt, явно связанным с его базовый тип там .... как указывали более быстрые машинистки.

1
ответ дан 18 December 2019 в 09:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: