2015-08-18 9 views
6

Допустим, у нас есть несколько интерфейсов, определенных в библиотеке классов .NET, написанных на C#. Есть ли способ реализовать эти интерфейсы в сценарии PowerShell?Можем ли мы реализовать интерфейсы .NET в сценариях PowerShell?

Звоните, это необходимо для бизнеса. Мы, как поставщик, предоставляем несколько интерфейсов, которые наши клиенты используют для использования нашего продукта. Один из наших клиентов хочет сделать это из сценария PowerShell.

+0

Почему вы хотите это сделать? PowerShell динамически типизируется. – poke

+0

@poke не видит, что это касается его вопроса, реализация интерфейса не имеет никакого отношения к набору параметров powershell, возможно, ему нужно передать свои объекты методу .net, который ожидает IEnumerable для Пример –

+0

@RonanThibaudau. Мой вопрос связан с выяснением [X этого Y] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). – poke

ответ

4

Хотя вы не можете реализовать интерфейс из 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 
1

Нет, вы не можете. PowerShell является (в основном) потребителем языком, вы не можете использовать его для создания объектов, соответствующих интерфейсу C#. Наиболее очевидным решением для этого конкретного клиента является реализация необходимых интерфейсов в C#, а затем создание экземпляров этих объектов из их экосистемы PowerShell и предоставление их в библиотеке классов.

9

Вот простой пример с 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 

Вы можете даже иметь класс (так называемый), который наследует от другой класс (так называемый B) и реализует IEqualityComparer:

Class A:B,System.Collections.IEqualityComparer { 
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" 
Смежные вопросы