首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在c#中读取封装在对象中的结构数组

在c#中读取封装在对象中的结构数组
EN

Stack Overflow用户
提问于 2011-05-27 16:52:01
回答 2查看 509关注 0票数 2

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

以下是程序集的声明:

代码语言:javascript
复制
public struct WHATEVER
{
}

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

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

代码语言:javascript
复制
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没有变化。这是正确的。我的问题是我不知道如何从子数组中挑选项:

代码语言:javascript
复制
object objRestuls = Params[0];

这个语句起作用了,显示了我期望在watch-window中显示的项,但我不知道如何迭代并从object中拾取它们。当我尝试这样做时:

代码语言:javascript
复制
object [] objRestuls = (object [])Params[0];

抛出以下异常:

代码语言:javascript
复制
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[]'.

有谁有关于如何读取封装在对象中的结构数组的提示吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-27 17:04:05

您可以使用:

代码语言:javascript
复制
Array array = (Array) Params[0];

然后使用Array的成员迭代它,甚至使用foreach (这将对每个元素进行装箱)。

它目前不能工作的原因是值类型值的数组不是引用的数组-所以这甚至不能编译:

代码语言:javascript
复制
// Invalid
object[] array = new int[10];
票数 2
EN

Stack Overflow用户

发布于 2011-05-27 16:57:44

你有没有试过TestAssembly.WHATEVER w0 = (TestAssembly.WHATEVER)Params[0][0]

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6149904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档