Я работаю над проектом, в котором использую входные свойства для создания параметров объектов со строгими типами. У меня есть этот пример кода:
с использованием системы; использование System.Management.Automation; использование System.Management.Automation.Runspaces; используя System.Linq; пространство имен TestExtractedData { общедоступный класс ExtractData { общественный Тип Типа {получить; набор; } публичная строка Параметр {get; набор; } общедоступные динамические данные {get; набор; } } [Командлет («Получить», «Извлеченные данные»)] [OutputType(typeof(ExtractData))] открытый класс GetExtractedDataCommand: PSCmdlet { [Параметр( Обязательно = правда, Позиция = 1, ValueFromPipeline = правда, ValueFromPipelineByPropertyName = false)] общественный PSObject [] InputObject {get; набор; } // Этот метод вызывается один раз для каждого командлета в конвейере, когда конвейер начинает выполняться защищенное переопределение void BeginProcessing() { WriteVerbose("Начать!"); } // Этот метод будет вызываться для каждого ввода, полученного из конвейера в этот командлет; если ввод не получен, этот метод не вызывается защищенное переопределение void ProcessRecord() { свойства var = InputObject[0].Members.Where(w => w.GetType() == typeof(PSNoteProperty)).ToList(); var ExtractedData = Properties.Select(s => новый ExtractData { Параметр = имя с., Тип = Тип.GetType(s.TypeNameOfValue), Data = (из o в InputObject выберите o.Properties[s.Name].Value).ToArray() }).К списку(); var myDate = InputObject[0].Properties["Дата"]; var myInt32 = InputObject[0].Properties["Int32"]; var myTypedInt = InputObject[0].Properties["TypedInt"]; var myText = InputObject[0].Properties["Текст"]; вар myDateType = myDate.Value.GetType().Name; вар myIntType = myInt32.Value.GetType().Name; вар myTypedIntType = myTypedInt.Value.GetType().Name; вар myTextType = myText.Value.GetType().Name; WriteObject (извлеченные данные); } // Этот метод будет вызван один раз в конце выполнения конвейера; если ввод не получен, этот метод не вызывается защищенное переопределение void EndProcessing() { WriteVerbose("Конец!"); } } } Я могу отладить модуль, выполнив эту команду:
1..100 | foreach { [pscustomobject]@{Date = (Get-Date).AddHours($_);Int32 = $_;TypedInt = [int]$_ ; Text = "Итерация $_"}} | Get-ExtractedData Я знаю следующее о параметрах в моем [pscustomobject]:
[*]Дата преобразуется в объект DateTime. [*]Int32 не определен мной и преобразуется в int32 с помощью PowerShell. [*]TypedInt преобразуется в целое число [*]Текст не определен мной и преобразуется в строку с помощью PowerShell.
Когда я отлаживаю код в Visual Studio, я получаю следующее:

Я ожидал, что значение Int32 будет иметь тип Int32, но вместо этого оказалось PSObject.
Мой вопрос: почему это происходит и происходит ли это только с целыми числами или с другими типами, которые не приводятся в хэш-таблице, переданной в [pscustomobject]?
Я действительно хочу, чтобы Int32 был int32 в моем коде C#, но я не знаю, как это сделать. Я попробовал это:
var изменение = Convert.ChangeType(myInt32.Value, typeof(int)); но из-за этой ошибки это не получается:
Get-ExtractedData: объект должен реализовывать IConvertible.
Мобильная версия