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

标签 c# arrays reflection object struct

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

以下是来自程序集的声明:

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”放在监 window 口上时,它显示它包含一个 1 元素数组,其中还包含一个充满元素的 N 大小数组,并且 objStructs 未更改。这是对的。我的问题是我不知道如何从子数组中选择项目:

object objRestuls = Params[0];

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

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[]'.

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

最佳答案

您可以使用:

Array array = (Array) Params[0];

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

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

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

关于c# - 在c#中读取封装在对象中的结构体数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6149904/

相关文章:

c# - 使用数据中的参数调用 C# 方法

java - 如何使用注释使用默认构造函数初始化字段

c# - Active Directory 和 PrimaryPermission

c# - 我想使用 c# 从共享点列表中检索数据并将它们存储到 SQL Server 数据库表中。我怎样才能做到这一点?

c++ - 如何在 C++ 中初始化动态数组?

php - 通知: Undefined index of a xml

Java:如何复制一个对象,使其来自同一个子类?

c# - MVC4 : How to show Group of checkboxes with header checkbox?

javascript - 无法将多个参数绑定(bind)到请求的内容

c - "error array type has incomplete element type"二维数组