将参数传递给需要“ref System.Array”的方法

时间:2009-08-21 12:22:31

标签: c# arrays methods

我正在使用第三方库。其中一种方法需要通过ref传递一个数组,该数组将填充一些信息。以下是该方法的定义:

int GetPositionList(ref Array arrayPos)

如何构造arrayPos以使此方法有效?在库不太完整的文档中,它定义了这样的方法:

long GetPositionList(structSTIPosUpdate() arrayPos)

我试过这个,但当然我收到了错误:

System.Array position_list = new System.Array();
sti_position.GetPositionList(ref position_list);

有什么想法吗?

6 个答案:

答案 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;
        }
    }