Class 当类定义是源代码时,如何从模块导出类?

Class 当类定义是源代码时,如何从模块导出类?,class,powershell,module,export,Class,Powershell,Module,Export,假设我们有一个名为importset的模块,如下所示: # ~\Modules\ImportTest\ImportTest.psm1 . ("{0}\TestClass.ps1" -f $PSScriptRoot) # skip Export-ModuleMember because there is no explicit way to export classes # ~\Modules\ImportTest\TestClass.ps1 Class TestClass { [str

假设我们有一个名为
importset
的模块,如下所示:

# ~\Modules\ImportTest\ImportTest.psm1
. ("{0}\TestClass.ps1" -f $PSScriptRoot)
# skip Export-ModuleMember because there is no explicit way to export classes

# ~\Modules\ImportTest\TestClass.ps1
Class TestClass {
    [string] $OS
    [string] $Name
}
function New-Object2
{
    param($FullyQualifiedName)
    $moduleName,$className = $FullyQualifiedName.Split('\')
    & (Get-Module $moduleName).NewBoundScriptBlock(
        [scriptblock]::Create("[$className]::new()")
    )
}
正如我从中了解到的,可以使用关键字
using
来加载包含类的模块。所以我试了一下:

using module ImportTest
# skip Import-Module ImportTest because it does not load classes. 
$myclass = [TestClass]::new()
但它仍然没有找到定义。如果我在脚本模块文件
(ImportTest.psm1)
中定义类,它就会工作


我错过什么了吗正如我所知,没有其他方法可以执行
dotsourcing
或将其导出到其他范围。

您尝试的方法是我认为它应该工作的方式,但至少PowerShell 5.0和5.1不是这样工作的。值得一提的是,
using
关键字并没有在我的项目中成为生产代码,因为它总是表现出某种荒谬的行为。这方面有一些改进,因此我们可能会看到6.0中的一些改进。我看到了两种解决方法

实现一个返回类的函数 那么

Import-Module ImportTest
New-TestClass
获取
TestClass
的实例

缺点是模块代码中充斥着与导出类相关的代码

在绑定脚本块内调用新对象 您可以使用绑定的脚本块来获取
TestClass
的实例:

(Get-Module ImportTest).NewBoundScriptBlock({[TestClass]::new()})
如果这太难看了,你可以写一个实用函数如下:

# ~\Modules\ImportTest\ImportTest.psm1
. ("{0}\TestClass.ps1" -f $PSScriptRoot)
# skip Export-ModuleMember because there is no explicit way to export classes

# ~\Modules\ImportTest\TestClass.ps1
Class TestClass {
    [string] $OS
    [string] $Name
}
function New-Object2
{
    param($FullyQualifiedName)
    $moduleName,$className = $FullyQualifiedName.Split('\')
    & (Get-Module $moduleName).NewBoundScriptBlock(
        [scriptblock]::Create("[$className]::new()")
    )
}
那么


返回TestClass对象的实例。

TestClass.ps1
->
TestClass.psm1
。(“{0}\TestClass.ps1”-f$PSScriptRoot)
->
使用模块。\TestClass.pm1
这就是它的工作方式。但是对于未定义的类/类型,我仍然收到一个错误。谢谢您的帮助。同时,我在使用模块清单中的
ScriptsToProcess
参数将类本身加载到父脚本范围时解决了我的问题:)不幸的是,PS 5.1中似乎没有任何令人信服的与类相关的改进来在生产环境中处理类。5.1确实改进了一些涉及上课。我在生产中的一些模块中使用类。如果您具有生产代码通常保证的测试覆盖率,那么即使在5.0中,PowerShell类也可以——类的行为可能与您最初期望的不同。PowerShell的很多功能都没有达到我最初的预期,这意味着我有相当高的测试覆盖率。使用类并不能真正改变这种演算。类允许进行一些重构,从而大大减少了行数,因此对于我所处理的项目来说,它们是一个相当大的胜利。我真的很想使用类,因为它确实加快了创建自定义数据结构的速度。使用PSCustomObjects并为其指定唯一的类型名称并非总是最佳解决方案。但是一个很大的缺点是类方法中缺少高级函数。