代码之家  ›  专栏  ›  技术社区  ›  CD..

C收集到经典ASP

  •  7
  • CD..  · 技术社区  · 14 年前

    我无法将C集合公开给经典ASP。 我尝试使用IEnumerable和数组。但我得到了“ object not a collection “错误。

    我的方法如下:

    public IEnumerable<MyObj> GetMyObj() { ... }
    

    在经典的ASP方面:

    Dim obj, x 
    Set obj = Server.CreateObject("Namespace.class")
    
    For Each x in obj.GetMyObj
    ...
    

    那么,如何将集合传递给经典ASP呢?

    更新:

    可能这是一个进步,我找到的解决方案是使用继承的新类 IEnumerable 而不是使用 IEnumerable<MyObj> :

    public class MyEnumerable : IEnumerable
    {
       private IEnumerable<MyObj> _myObj;
    
       .
       .
       .
    
        [DispId(-4)]
        public IEnumerator GetEnumerator()
        {
          _myObj.GetEnumerator();
        }
    }
    

    但现在当我试图 访问属性 属于 MyObj 我得到了一个错误: Object required .

    有什么想法吗?

    4 回复  |  直到 9 年前
        1
  •  6
  •   KeithS    14 年前

    我想你找到了答案;经典的VB ASP没有内置泛型。所以,你试图通过 IEnumerable<MyObj> 对ASP来说,它是一个噩梦般的混搭名称,经典的ASP不知道如何使用它。

    解决方案是传递非泛型IEnumerable。然后,问题是序列被视为包含基本对象实例。您必须恢复到2.0之前的方法来强制转换从列表中获得的对象。在vb中,这并不难;只需显式指定元素类型,vb将在遍历for each时隐式为您强制转换:

    Dim obj, x 
    Set obj = Server.CreateObject("Namespace.class")
    
    For Each x As MyObj in obj.GetMyObj //casts each element in turn
       ...
    
        2
  •  0
  •   Jakub Konecki    14 年前

    我知道这听起来很奇怪,但我有一个类似的问题,通过用括号将收藏包起来解决了这个问题。

    For Each x in (obj).GetMyObj
    

    不知道为什么这会有什么不同,但它对我有用…

        3
  •  0
  •   Yots    14 年前

    如果你得到了 Object required 试试这个错误:

    For Each key in obj.GetMyObj
        Set x = obj.GetMyObj(key)
        Response.Write x.YOURPROPERTY
    Next
    
        4
  •  0
  •   Xaqron    14 年前

    逆向工程可以解决这个问题。 尝试将ASP经典集合传递给ASP.NET,然后查看对象的类型。然后您可以将该类型从ASP.NET传递到经典ASP,而不是尝试错误方法。 如果ASP.NET中没有相关的类型,那么您应该进行更多的逆向工程,并研究二进制数据,以便找到模式并编写自己的强制转换方法。