Как использовать методы расширения в Powershell?

У меня есть следующий код:

using System
public static class IntEx
{
    /// <summary>
    /// Yields a power of the given number
    /// </summary>
    /// <param name="number">The base number</param>
    /// <param name="powerOf">the power to be applied on te base number</param>
    /// <returns>Powers applied to  the base number</returns>
    public static IEnumerable<int> ListPowersOf(this int number, int powerOf)
    {
        for (var i = number; ; i <<= powerOf)
        {
            yield return i;
        }
    }
}

Я загрузил dll в Powershell (Windows 8). Я пытаюсь использовать его следующим образом:

$test = 1.ListPowersOf(2)

Должен возвращать @(1, 2, 4, 8, 16...)

Вместо этого он говорит, что такого метода нет.

Я попробовал следующее:

[BaseDllNamespace]::ListPowersOf(1,2)

По-прежнему ничего. У меня нет пространства имен в классе IntEx.

Как заставить его работать

Ответ 1

Попробуйте следующее:

[IntEx]::ListPowersOf(1,2)

или

[IntEx] | gm -Static -Type Method

чтобы просмотреть доступные статические методы.

Вы также можете использовать отражение для получения списка экспортируемых типов, чтобы узнать, доступен ли ваш доступ:

[Reflection.Assembly]::LoadFile('C:path\to.dll')|select -ExpandProperty ExportedTypes

Ответ 2

Если вы действительно хотите, чтобы он читался ближе к точечному синтаксису, вы можете использовать оператор неявного или явного преобразования для вашего типа IntEx и использовать его как POCO, а не как статическое расширение.

Это может выглядеть примерно так...

[email protected]'
public class MyExtClass {

    public string TheStringValue {get; set;}

    public MyExtClass(string theString){
        TheStringValue = theString;
    }

    public int NumberOf(string target)
    {
        return TheStringValue.Length - TheStringValue.Replace(target, "").Length;
    }

    public static implicit operator MyExtClass(string value){
        return new MyExtClass(value);
    }
}
'@
add-type -TypeDefinition $code

$str_eee = "TheTheThe"
$numberOfEs = ([MyExtClass]$str_eee).NumberOf("e")

if(3 -eq $numberOfEs){Write-Host PASS; exit 0}

Write-Host "FAIL";
exit 1