2009-06-23 35 views
5

Tôi mới sử dụng web services dưới powershell, vì vậy có thể tôi có một sự hiểu lầm cơ bản về một cái gì đó. Tôi đang làm việc với Reporting Services của Microsoft. Đây là một kịch bản repro.Powershell, dịch vụ web và loại đối tượng

$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() 

Nếu tôi chạy đó, tôi nhận được cái gì đó trông nhiều hơn hoặc ít hơn như thế này:

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

Vì vậy, câu hỏi của tôi là: Tại sao DataSource có System.Object như một BaseType khi DataSourceReference rõ ràng có một đối tượng loại đó là dựa trên các đối tượng web? Cả hai đều được tạo từ không gian tên ReportingWebService, phải không?

vấn đề gốc rễ của tôi là tôi cần phải trao một mảng của DataSources trở lại SetItemDataSources, và SetItemDataSources cuộn cảm trên một mảng của System.Objects, và tôi dường như không thể cast nó với những gì tôi muốn.

Trả lời

0

Nếu bạn chỉ có một đối tượng duy nhất và bạn muốn vượt qua một mảng các đối tượng (ví dụ một mảng với một yếu tố duy nhất trong nó - đối tượng duy nhất của bạn), bạn sử dụng @() Cú pháp:

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

-Oisin

2

Tất cả điều này có nghĩa là lớp "DataSource" kế thừa trực tiếp từ System.Object. Trong khi "DataSourceReference" kế thừa từ "DataSourceDefinitionOrReference", thì có thể một cái gì đó khác, sau đó System.Object.

Tuy nhiên, tôi không nghĩ đó là vấn đề của bạn. Vấn đề của bạn có lẽ là sự phân chia tự động của PowerShell và kết hợp lại các bộ sưu tập thành các bộ sưu tập chung của System.Object. Bạn có thể kiểm soát điều này bằng cách đặt loại tĩnh trên bộ sưu tập như vậy (tôi đoán API này bạn đang sử dụng vì tôi chưa tự sử dụng):

$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) 
Các vấn đề liên quan