【问题标题】:Passing Argument To Method that Requires "ref System.Array"将参数传递给需要“ref System.Array”的方法
【发布时间】:2009-08-21 12:22:30
【问题描述】:

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

int GetPositionList(ref Array arrayPos)

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

long GetPositionList(structSTIPosUpdate() arrayPos)

我已经尝试过了,但我当然会遇到错误:

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

有什么想法吗?

【问题讨论】:

    标签: c# arrays methods


    【解决方案1】:

    这是 Sterling Trader Pro ActiveX API,对吧?您是否使用tlbimp.exe 创建了互操作 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 是数组中元素的数量。

    【讨论】:

    • @Vinay - 是的,它是 Sterling API。当我尝试执行您所描述的操作时,我得到了这个:'SterlingLib.ISTIPosition.GetPositionList(ref System.Array)' 的最佳重载方法匹配有一些无效参数和参数'1':无法从'ref SterlingLib 转换。 structSTIPositionUpdate[]' 到 'ref System.Array'
    • 戴夫,您接受了这个答案,创建实例对您有用吗?不幸的是,我也在 Sterling 工作,并且想在订单输入时交易 nsome 票据
    【解决方案2】:

    要创建Array 的实例,您可以使用CreateInstance 方法:

    Array a = Array.CreateInstance(typeof(Int32), 10);
    GetPositionList(ref a);
    

    数组的类型、维度和大小是库作者应该记录的内容。 GetPositionList 可能设计不当,只是为您创建了一个新的Array,本质上意味着库作者应该使用out 而不是ref。在这种情况下,您可以使用 null 数组:

    Array a = null;
    GetPositionList(ref a);
    

    【讨论】:

      【解决方案3】:

      您可以使用Array.CreateInstance

      【讨论】:

        【解决方案4】:

        这可能会帮助您: http://msdn.microsoft.com/en-us/library/szasx730%28VS.80%29.aspx

        ...虽然我不明白为什么一个对象需要有“ref”关键字。对象是通过引用传递的,所以无论如何这应该可以工作,而不使用 ref 关键字。对于像 int[]string 这样的数组,我明白这一点......

        【讨论】:

        • 因为它不只是填充数组,它会创建一个新数组并将调用者的引用替换为对新数组的引用。如果没有 ref 或 out 关键字,这是不可能的,它允许您将引用传递给引用本身(通常您传递引用的副本)。
        【解决方案5】:

        这行得通:

        Array position_list = new int[]{1, 3, 5, 5,6};    
        sti_position.GetPositionList(ref    position_list);
        

        【讨论】:

          【解决方案6】:

          我也使用 Sterling Trader API。我使用此代码:

          private structSTIPositionUpdate[] PositionList {
                  get {
                      Array arrayPos = null;
                      _position.GetPositionList(ref arrayPos);
                      return (structSTIPositionUpdate[]) arrayPos;
                  }
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-22
            • 1970-01-01
            • 2012-11-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多