如何通过使用Powershell从另一个类(.cs)文件中读取来创建类?

时间:2011-01-20 15:23:01

标签: powershell powershell-v2.0

我有这个POGO(简单的putter getter)类,我试图在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}
}

*注意最后一行是占位符,以便稍后更复杂的逻辑。

对于文件中的每个get / set,这会在Add-Type处中断,并显示此错误消息。

'MyApp.VM.MyClassVM.CtrId.get'必须声明一个正文,因为它未标记为抽象或外部

我将非常感谢有关我所做错事的任何信息。

3 个答案:

答案 0 :(得分:5)

试试这段代码,它对我有用。

$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

答案 1 :(得分:3)

由于您在类型定义中使用属性快捷方式,因此需要确保使用-Language CSharpVersion3命令中的Add-Type使用C#v3进行编译。

正如@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
}

答案 2 :(得分:1)

您有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}