我正在使用第三方库。其中一种方法需要通过ref传递一个数组,该数组将填充一些信息。以下是该方法的定义:
int GetPositionList(ref Array arrayPos)
如何构造arrayPos以使此方法有效?在库不太完整的文档中,它定义了这样的方法:
long GetPositionList(structSTIPosUpdate() arrayPos)
我试过这个,但当然我收到了错误:
System.Array position_list = new System.Array();
sti_position.GetPositionList(ref position_list);
有什么想法吗?
答案 0 :(得分:3)
这是Sterling Trader Pro ActiveX API,对吧?您是否使用tlbimp.exe
创建了Interop dll? GetPositionList
API需要一个包含structSTIPositionUpdate
类型结构的数组。通常,如果被调用者初始化传入的数据,则使用out
修饰符;如果要初始化数据,则使用ref
。根据API的含义,修饰符应为out
,因此这应该起作用:
structSTIPositionUpdate [] entries = new structSTIPositionUpdate[0]; // or null
num_entries_returned = GetPositionList(ref entries);
或者,尝试创建这些结构的数组,其大小足以容纳预期的条目数,然后将其传递给函数:
structSTIPositionUpdate [] entries = new structSTIPositionUpdate[100]; // say
num_entries_returned = GetPositionList(entries);
更新:如果您遇到与System.Array
类型不匹配的问题,请尝试
System.Array entries = Array.CreateInstance(typeOf(structSTIPositionUpdate), N);
其中N是数组中元素的数量。
答案 1 :(得分:2)
要创建Array
的实例,您可以使用CreateInstance
方法:
Array a = Array.CreateInstance(typeof(Int32), 10);
GetPositionList(ref a);
数组的类型,维度和大小是图书馆作者应该记录的内容。 GetPositionList
可能设计得很糟糕,只是为您创建一个新的Array
,这实际上意味着图书馆作者应该使用out
而不是ref
。在这种情况下,您可以使用null
数组:
Array a = null;
GetPositionList(ref a);
答案 2 :(得分:1)
您可以使用Array.CreateInstance
答案 3 :(得分:0)
这可能对您有所帮助: http://msdn.microsoft.com/en-us/library/szasx730%28VS.80%29.aspx
...虽然我不明白为什么一个对象需要有“ref”关键字。对象通过引用传递,因此无论如何都应该工作,而不使用ref关键字。对于像int[]
或string
这样的数组,我理解这一点......
答案 4 :(得分:0)
这有效:
Array position_list = new int[]{1, 3, 5, 5,6};
sti_position.GetPositionList(ref position_list);
答案 5 :(得分:0)
我也使用Sterling Trader API。我使用这段代码:
private structSTIPositionUpdate[] PositionList {
get {
Array arrayPos = null;
_position.GetPositionList(ref arrayPos);
return (structSTIPositionUpdate[]) arrayPos;
}
}