2015-06-22 2 views
4

Новое на C#, но в PowerShell. Взятие чужого кода. Написание компилируемого модуля PowerShell и попытка выяснить, как создать объект на основе возвращаемых данных. Сейчас, код возвращает строку:Создайте PSObject PowerShell в командлете C#

ServerResponse<UCCSiteModel> requestModel = this.MakeRequest("/site/api/", "site", "GET", this.Credentials, queryString); 
StringBuilder builder = new StringBuilder(); 

if (requestModel != null && requestModel.Response != null) 
{ 
    builder.AppendLine("SiteID: " + requestModel.Response.SiteID); 
    builder.AppendLine("Identity: " + requestModel.Response.SiteName); 
    builder.AppendLine("Site Code: " + requestModel.Response.SiteCode); 
    builder.AppendLine("Contact Name: " + requestModel.Response.ContactName); 
    builder.AppendLine("Contact Number: " + requestModel.Response.ContactNumber); 
    builder.AppendLine("Contact Email Address: " + requestModel.Response.ContactEmailAddress); 
    builder.AppendLine("Address: " + requestModel.Response.Address); 
    builder.AppendLine("City: " + requestModel.Response.City); 
    builder.AppendLine("State: " + requestModel.Response.State); 
    builder.AppendLine("Post Code: " + requestModel.Response.PostCode); 
    builder.AppendLine("Time Zone: " + requestModel.Response.Timezone); 
    builder.AppendLine("Longitude: " + requestModel.Response.longitude); 
    builder.AppendLine("Latitude: " + requestModel.Response.latitude);      
    this.WriteResponse(requestModel, builder.ToString()); 
} 

Как создать объект из requestModel.Response отправить обратно в PowerShell вместо строки? При написании PowerShell я бы обычно использовал New-Object PsObject, а затем Add-Member. Не знаете, как это сделать на C#, или то, что он вызвал (так что я могу искать). Кто угодно?

+0

Почему бы вам просто не вернуть 'requestModel' или' requestModel.Response'? –

+0

, потому что это содержит несколько вещей, таких как большой капля, которые я не хочу в объекте. –

ответ

4

Вы можете отразить поведение Add-Member просто вызвав Add() на Members собственности вашего PSObject (я хотел бы изменить имена свойств в CamelCase для облегчения доступности в PowerShell):

if (requestModel != null && requestModel.Response != null) 
{ 
    PSObject responseObject = new PSObject(); 

    responseObject.Members.Add(new PSNoteProperty("SiteID", requestModel.Response.SiteID)); 
    responseObject.Members.Add(new PSNoteProperty("Identity", requestModel.Response.SiteName)); 
    // and so on etc... 
    responseObject.Members.Add(new PSNoteProperty("Latitude", requestModel.Response.latitude)); 

    this.WriteObject(responseObject); 
} 
+0

Так что это дает мне ту же проблему, что и другие методы, которые я пытался. В строке WriteResponse сообщения responseObject «Тип аргумента« System.Management.Automation.PSObject »не могут быть присвоены типу параметра« строка » –

+0

Извините, у вас сложилось впечатление, что вы наследовали класс' Cmdlet' (в этом случае вы бы верните объект с помощью 'WriteObject()', а не 'WriteResponse()') –

+0

Это трюк. Я очень ценю комментарии и предложения каждого. –

2

Не зная подробностей, я не могу сказать, что это лучший план, но вот что я буду делать. Вы можете определить класс, а затем вернуть его. Таким образом, вы можете создать новый класс, например, как показано ниже:

public class RequestResponse { 
    public int SiteID { get; set;} 
    public string Identity { get; set; } 
    other fields... 
} 

Далее в коде вы в курсе, вы должны создать объект, а затем заполнить свойство класса.

var response = new RequestResponse(); 

if (requestModel != null && requestModel.Response != null) 
{ 
    response.SiteID = requestModel.Response.SiteID; 
    response.Identity = requestModel.Response.Identity ; 

    fill in other fields... 
    this.WriteResponse(requestModel, response); 
} 

Надеюсь, это поможет вам начать работу в правильном направлении.

Wade

Смежные вопросы