在Powershell中,如何使用字节数组作为C#通用类之一的键类型?

维斯瓦纳特·卡玛特

我在无法修改的外部DLL中具有C#类。库中的两个类定义如下,需要在Powershell脚本中使用。

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

我想在Powershell脚本中创建MyCsharpClass的实例,如下所示:

$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类型的byte []的第一个右括号']'使Powershell混淆了类型定义正在关闭,因此当它在表达式末尾观察到意外的标记']'时,就会引发错误。

我还尝试用System.Collections.Generic.List类型替换byte []类型,该类型现在可以很好地用于声明类型。

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的异常:无法将参数“ translator”转换为值“ MyByteTranslatorCSharpClass”,对于“ .ctor”,键入“ ISomeBaseTranslator [System.Collections.Generic.List 1[System.Byte],System.Collections.Generic.List1 [System.Byte] ]”

在这种情况下,请让我知道,如何在Powershell中为TKey和TValue通用参数创建具有byte []类型的MyCsharpClass实例请注意,我既不能更改DLL端,也无法获取其源代码。

Mathias R. Jessen

这似乎是类型名称解析错误。

幸运的是,您可以通过使用一对额外的方括号([]“限定”类型参数文字来轻松解决此问题

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

...或通过直接使用反射构造具体类型:

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

$myType::new(...)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用字节数组作为Map键

如何在MapDB的BTreeMap实现中使用字节数组作为键

在Python中使用字节数组作为AES算法的键

使用字节数组时出现类型错误

如何使用字节缓冲区表示一个字节数组中的数据?

使用 C# 在字节数组中设置位

C#使用字节数组填充列表框

如何使用C#在查询中传递字节数组?

Java-将字节数组作为字符串存储在数据库中,并使用字符串值创建字节数组

从字节数组C#中读取特定的字节

如何从C中的字节数组中删除字节?

使用 C# 中其他类中定义的方法将对象转换为字节数组

如何在C#中将字节数组或字符串作为文件http发布

来自特定索引的字节数组作为C#中的struct,而没有进行复制

c#用字节数组输入生成crc8字节方法

C#中类实例到原始字节数组的转换

在字节数组中使用字节串

将字节从字节数组复制到C#中另一个字节数组的特定位置

在 C# 中获取 ZipArchive 的字节数组

Xamarin中使用C#的图像字节数组

使用C#从字节数组解码dtmf

字节数组属性 C#

C# 如何将一组整数变量转换为字节数组?

使用C#中的MimeKit获取字节数组中的附件

将字节数组复制到C#中的另一个字节数组

如何在C中连接字节数组

如何在C#中将标记的src设置为字节数组中的pdf内容

C#如何只读取字节数组[]中的选定值?

如何在 C# 或字节数组左移操作中执行位复制