Свойства BufferCell только для чтения? - PullRequest
1 голос
/ 14 октября 2019

Я пытаюсь установить свойства ForegroundColor и BackgroundColor для BufferCells, выделенных с помощью NewBufferCellArray в powershell.exe в Windows 10. Я считаю, что назначения появляютсячтобы не иметь никакого влияния, например,

> $a = $Host.UI.RawUI.NewBufferCellArray("abc", [System.ConsoleColor]::White, [System.ConsoleColor]::Black)
> $a[0, 0].ForegroundColor
White
> $a[0, 0].ForegroundColor = [System.ConsoleColor]::Blue
> $a[0, 0].ForegroundColor
White

В соответствии с документацией, указанной выше, кажется, что оба свойства должны иметь установщики - они не реализованы в классах PSHostRawUserInterface powershell.exe?

1 Ответ

0 голосов
/ 15 октября 2019

После некоторого эмпирического тестирования, обходной путь должен изменить свойство временного объекта, а затем присвоить его обратно массиву:

> $x = $a[0,0]
> $x.ForegroundColor = [System.ConsoleColor]::Blue
> $x.ForegroundColor
Blue
> $a[0, 0] = $x
> $a[0, 0].ForegroundColor
Blue

Я не знаю всех подробностей, но это, вероятно, связаноBufferCell является структурой, а не классом (см. source на GitHub ), поэтому передача по значению, а не по ссылке и / или NewBufferCellArray возвращает типизированный массив BufferCell [,].

Для сравнения посмотрите следующее:

$type = @"
public struct MyStruct
{
    System.ConsoleColor foregroundColor;
    public System.ConsoleColor ForegroundColor
    {
        get { return foregroundColor; }
        set { foregroundColor = value; }
    }
}
"@

Add-Type -TypeDefinition $type;

$a = new-object -TypeName "MyStruct[]" 5;
$a[0].ForegroundColor = "Blue"
$a[0].ForegroundColor # Black

$a = new-object -TypeName "MyStruct[]" 5;
$x = $a[0];
$x.ForegroundColor = "Blue"
$a[0] = $x
$a[0].ForegroundColor # Blue

$a = @((new-object MyStruct))
$a[0].ForegroundColor = "Blue"
$a[0].ForegroundColor # Blue
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...