正在读取封装在c#中的Object中的结构数组

本文关键字:数组 Object 结构 中的 读取 封装 | 更新日期: 2023-09-27 17:57:52

我正在使用反射来处理运行时加载的程序集。我的问题是其中一个方法有一个输出参数,其中包含一个structs数组。

以下是来自汇编的声明:

public struct WHATEVER
{
}
public class SOMECLASS
{
    public static int methodCall(out WHATEVER[] ppWhateverStructs);
}

以下是我尝试执行的方法:

Type tWHATEVER = Assembly.Load("path-to-Assembly").GetType("WHATEVER");
Type tSOMECLASS = Assembly.Load("path-to-Assembly").GetType("SOMECLASS");
Array objStructs = Array.CreateInstance(tWHATEVER, 1);
object[] Params = new object[] { @objStructs };             // tried with and without "@" - same thing
MethodInfo method = tSOMECLASS.GetMethod("methodCall", new Type[] { tWHATEVER.MakeArrayType().MakeByRefType() });
retVal = method.Invoke(null, Params);

当我把"Params"放在监视窗口上时,它显示它包含一个1元素数组,其中还包含一个填充了元素的N大小数组,objStructs没有改变。这是正确的。我的问题是我不知道如何从子数组中挑选项目:

object objRestuls = Params[0];

这个语句有效,显示了我在观察窗口中期望的项目,但我不知道如何迭代并从对象中提取它们。当我尝试这个:

object [] objRestuls = (object [])Params[0];

引发以下异常:

An unhandled exception of type 'System.InvalidCastException' occurred in TestAssembly.dll
Additional information: Unable to cast object of type 'TestAssembly.WHATEVER[]' to type 'System.Object[]'.

有人知道如何读取封装在对象中的结构数组吗?

正在读取封装在c#中的Object中的结构数组

您可以使用:

Array array = (Array) Params[0];

然后使用Array的成员或者甚至使用foreach(这将框住每个元素)对其进行迭代。

它目前不起作用的原因是值类型值的数组不是引用的数组,所以它甚至无法编译:

// Invalid
object[] array = new int[10];

您尝试过TestAssembly.WHATEVER w0 = (TestAssembly.WHATEVER)Params[0][0]吗?