我们可以在PowerShell脚本中实现.NET接口吗?

时间:2015-08-18 06:32:32

标签: c# .net powershell powershell-v3.0

假设我们在用C#编写的.NET类库中定义了一些接口。有没有办法在PowerShell脚本中实现这些接口?

将此称为业务需求。作为供应商,我们提供一些由客户实施的接口来使用我们的产品。我们的一位客户希望通过PowerShell脚本执行此操作。

3 个答案:

答案 0 :(得分:10)

这是PowerShell 5.0实现.Net IEqualityComparer 界面的一个简单示例:

Class A:System.Collections.IEqualityComparer {
  [bool]Equals($x,$y)  { return $x -eq $y        }
  [int]GetHashCode($x) { return $x.GetHashCode() }
}
[A]$a=[A]::new()
$a.Equals(1,1) -- returns True
$a.Equals(1,2) -- returns False
$a.GetHashCode("OK") -- returns 2041362128

你甚至可以拥有一个类(称为A),它继承自另一个类(称为B)并实现IEqualityComparer:

Class A:B,System.Collections.IEqualityComparer {

答案 1 :(得分:6)

您可以使用Add-Type在C#,JScript或VBScript中定义类。如果涉及供应商提供的程序集,只需在Add-Type来电之前加载,再拨打Add-Type

$sourceCode = @"
    public class CustomerClass : Vendor.Interface
    {
         public bool BooleanProperty { get; set; }
         public string StringProperty { get; set; }
    }
"@    # this here-string terminator needs to be at column zero

$assemblyPath = 'C:\Path\To\Vendor.dll'
Add-Type -LiteralPath $assemblyPath
Add-Type -TypeDefinition $sourceCode -Language CSharp -ReferencedAssemblies $assemblyPath

$object = New-Object CustomerClass
$object.StringProperty = "Use the class"

答案 2 :(得分:4)

编辑:您现在可以implement interfaces in powershell 5.0了。此答案适用于PowerShell 4.0或更早版本。

虽然您无法直接从powershell实现界面,但您可以传递powershell delegates to .NET code。您可以在构造函数中提供接受委托的接口的空实现,并从powershell构造此对象:

public interface IFoo
{
    void Bar();
}

public class FooImpl : IFoo
{
    Action bar_;
    public FooImpl(Action bar)
    {
        bar_ = bar;
    }

    public void Bar()
    {
        bar_();
    }
}

在powershell中:

$bar = 
{ 
   Write-Host "Hello world!"
}

$foo = New-Object FooImpl -ArgumentList $bar
# pass foo to other .NET code