Powershell, веб-сервисы и типы объектов - PullRequest
5 голосов
/ 23 июня 2009

Я новичок в использовании web services под powershell, поэтому, возможно, у меня есть базовое недопонимание о чем-то. Я работаю с Microsoft Reporting Services. Вот сценарий воспроизведения.

$computer = "rptdev"
$uri = "http://$($computer)/ReportServer/ReportService.asmx?WSDL"

$reporting = New-WebServiceProxy -uri $uri -UseDefaultCredential -namespace "ReportingWebService"

$dsRef = new-object ReportingWebService.DataSourceReference
$ds = new-object ReportingWebService.DataSource

$dsRef.GetType()
$ds.GetType()

Если я запускаю это, я получаю нечто, более или менее похожее на это:

Name                BaseType
----                --------
DataSourceReference ReportingWebService.DataSourceDefinitionOrReference
DataSource          System.Object

Итак, мой вопрос: почему DataSource имеет System.Object как BaseType, когда DataSourceReference явно имеет тип объекта, основанный на веб-объекте? Они оба были созданы из пространства имен ReportingWebService, не так ли?

Моя основная проблема в том, что мне нужно передать массив DataSources обратно в SetItemDataSources, а SetItemDataSources дросселирует массив System.Objects, и я не могу приведи к тому, что я хочу.

Ответы [ 2 ]

2 голосов
/ 28 июня 2009

Все это означает, что класс «DataSource» наследуется непосредственно от System.Object. Принимая во внимание, что «DataSourceReference» наследуется от «DataSourceDefinitionOrReference», затем может быть что-то другое, затем System.Object.

Однако я не думаю, что это ваша проблема. Возможно, ваша проблема заключается в автоматическом разбиении PowerShell и объединении коллекций в общие коллекции System.Object. Вы можете управлять этим, установив статический тип для коллекции следующим образом (я предполагаю, что вы используете этот API, поскольку сам не использовал его):

$computer = "rptdev"
$uri = "http://$($computer)/ReportServer/ReportService.asmx?WSDL"

$reporting = New-WebServiceProxy -uri $uri -UseDefaultCredential -namespace "ReportingWebService"

[ReportingWebService.DataSource[]]$DataSources = <do something to get your data sources>
$reporting.SetItemDataSources($DataSources)
0 голосов
/ 26 июня 2009

Если у вас есть только один объект и вы хотите передать массив объектов (то есть массив с единственным элементом в нем - вашим единственным объектом), вы используете синтаксис @ ():

ps> $o = new-object mynamespace.myobj
ps> $thing.Method( @($o) )

-Oisin

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...