Как создать класс, читая файл другого класса (.cs) с помощью Powershell? - PullRequest
3 голосов
/ 20 января 2011

У меня есть класс POGO (простой метод получения меток), который я пытаюсь прочитать в PowerShell

using System;
using System.Runtime.Serialization;

namespace MyApp.VM
{
  [Serializable]
  public class MyClassVM
  {
      public Int64 CtrId { get; set; }
      public string CtrName { get; set; }
      public string CtrPhone { get; set; }
      public string CtrZip { get; set; }
      public DateTime AddDate { get; set; }
  }
}

Вот код ps1, который пытается прочитать класс из файла.

function Build-Pogo
{
    $FileDir   = "D:\YourDirectoryOfPogo" 
    $ClassName = "MyClassVM"
    $FileName  = $FileDir + "\" + $ClassName + ".cs"

    # Build the class from the file
    $AllLines = [string]::join([environment]::newline, (Get-Content $FileName))
    Add-Type -TypeDefinition $AllLines

    # spin thru each property for class
    $ClassHandle = New-Object -typeName $ClassName
    $ClassHandle | ForEach-Object {Write-Host $_.name -foregroundcolor cyan}
}

* Обратите внимание, что последняя строка является заполнителем для более сложной логики, которая придет позже.

Это прерывает Add-Type с этим сообщением об ошибке для каждого get / set в файле.

'MyApp.VM.MyClassVM.CtrId.get' должен объявить тело, поскольку оно не помечено как абстрактное или внешнее

Любая информация о том, что я делаю неправильно, будет принята с благодарностью.

Ответы [ 3 ]

5 голосов
/ 29 января 2011

Попробуйте этот код, у меня это сработало.

$type = Add-Type -Path $FileName -PassThru

$x = New-Object $type
$x.CtrId = 500
$x.CtrName = 'Testing'
$x.CtrPhone = '555-1212'
$x.CtrZip = '12345'
$x.AddDate = Get-Date

$x

Выход:

CtrId    : 500
CtrName  : Testing
CtrPhone : 555-1212
CtrZip   : 12345
AddDate  : 1/28/2011 6:16:26 PM
3 голосов
/ 21 июня 2011

Поскольку вы используете ярлыки свойств в определении типа, вам необходимо убедиться, что компилируется с использованием C # v3 с помощью -Language CSharpVersion3 в команде Add-Type.

Как указывал @voodoomsr, вы должны предоставить пространство имен для New-Object, или вы можете вернуть тип из Add-Type, как @Chuck, с параметром -PassThru.

Здесьпример функции Build-POGO:

function Build-Pogo
{
    $FileDir   = "D:\YourDirectoryOfPogo" 
    $ClassName = "MyClassVM"
    $FileName  = $FileDir + "\" + $ClassName + ".cs"

    $AllLines = (Get-Content $FileName) -join "`n"
    $type = Add-Type -TypeDefinition $AllLines -Language CSharpVersion3 -PassThru

    New-Object $type
}
1 голос
/ 30 марта 2011

У вас есть 2 ошибки, 1: отсутствует пространство имен типа, 2: вы ничего не печатаете.Я даю вам возможное исправление:

$ClassHandle = New-Object -typeName MyApp.VM.$ClassName
$ClassHandle | fl     #basic way to print the members

более красивый отпечаток членов (Свойства)

 $ClassHandle | gm -MemberType Property |
 % {write-host $_.name  -for red -nonewline; 
 [console]::setcursorposition(15,[console]::cursortop);
 write-host $classhandle.($_.name) -f white}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...