В Powershell, как мне использовать байтовый массив в качестве типа ключа для одного из моих C# Generi c классов, пожалуйста? - PullRequest
2 голосов
/ 30 мая 2020

У меня есть класс C# во внешней DLL, который я не могу изменить. Два класса в библиотеке определены следующим образом, которые мне нужно использовать в моем сценарии Powershell.

public class MyCsharpClass<TKey, TValue> : ISomeBaseClass<TKey, TValue>
{
    public MyCsharpClass(string path, ISomeBaseTranslator<TKey, TValue> translator)
    {
        ...
    }
}
...
...
public class MyByteTranslatorCSharpClass: ISomeBaseTranslator<byte[], byte[]>
{
    ...
}

Я хочу создать экземпляр MyCsharpClass в сценарии Powershell следующим образом:

$MyType = [MyCsharpClass[byte[],byte[]]]::new($Path, [MyByteTranslatorCSharpClass]::new())

Но приведенная выше строка не работает с ошибкой ниже. Я могу просто ввести имя типа в командное окно PS ISE и получить ту же ошибку.

PS C:\> [MyCsharpClass[byte[],byte[]]]
At line:1 char:30
+ [MyCsharpClass[byte[],byte[]]]
+                                                                     ~
Unexpected token ']' in expression or statement.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : UnexpectedToken

Строка ниже работает нормально, хотя показывает мне информацию о типе моего класса, когда я просто использую байтовый тип для TKey:

PS C:\> [MyCsharpClass[byte,byte[]]]

IsPublic IsSerial Name                                     BaseType                                                                                                                                         
-------- -------- ----                                     --------                                                                                                                                         
True     False    MyCsharpClass                           System.Object 

Кажется, первая закрывающая скобка ']' для моего типа Key для байта [] сбивает Powershell с толку тем, что определение типа закрывается, и поэтому возникает ошибка при обнаружении неожиданного токена '] 'в конце выражения.

Я также попытался заменить тип byte [] на тип System.Collections.Generi c .List, который теперь отлично работает для объявления типа.

PS C:\> MyCsharpClass[System.Collections.Generic.List[System.Byte],System.Collections.Generic.List[System.Byte]]]

IsPublic IsSerial Name                                     BaseType                                                                                                                                         
-------- -------- ----                                     --------                                                                                                                                         
True     False    MyCsharpClass                           System.Object 

Однако вызов конструктора на этот раз завершается ошибкой при передаче экземпляра MyByteTranslatorCSharpClass в качестве второго аргумента в конструкторе (в конце строки ниже).

$MyType = [MyCsharpClass[System.Collections.Generic.List[System.Byte],System.Collections.Generic.List[System.Byte]]]::new($Path, [MyByteTranslatorCSharpClass]::new())

Это дает исключение для System. Management.Automation.MethodException: невозможно преобразовать аргумент «переводчик» со значением: «MyByteTranslatorCSharpClass» для «.ctor» в тип «ISomeBaseTranslator [System.Collecti ons.Generi c .List 1[System.Byte],System.Collections.Generic.List 1 [System.Byte]] "

Пожалуйста, дайте мне знать в этом контексте, как я могу создать экземпляр MyCsharpClass с byte [] type для аргументов TKey и TValue generi c в Powershell. Обратите внимание, что я не могу ни изменить сторону DLL, ни ее источник.

1 Ответ

3 голосов
/ 30 мая 2020

Похоже, это ошибка синтаксического анализа имени типа.

К счастью, вы можете легко обойти это, «уточнив» литералы параметров типа с помощью дополнительной пары квадратных скобок ([]):

[MyCsharpClass[[byte[]],[byte[]]]]::new(...)

... или построив конкретный тип напрямую с помощью отражения:

$myType = [MyCsharpClass`2].MakeGenericType(@([byte[]],[byte[]]))

$myType::new(...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...