我使用反射来处理在运行时加载的程序集。我的问题是其中一个方法有一个输出参数,其中包含一个结构数组。
以下是汇编的声明:
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[]'.
有没有人提示如何读取封装在对象中的struct-array?
答案 0 :(得分:2)
您可以使用:
Array array = (Array) Params[0];
然后使用Array
的成员进行迭代,甚至使用foreach
(将对每个元素进行包装)。
它当前不起作用的原因是值类型值的数组不是引用数组 - 所以这甚至不会编译:
// Invalid
object[] array = new int[10];
答案 1 :(得分:1)
你试过TestAssembly.WHATEVER w0 = (TestAssembly.WHATEVER)Params[0][0]
吗?