У меня есть класс 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, ни ее источник.