C#集合到Classic ASP

时间:2010-10-19 14:57:46

标签: c# com collections asp-classic

我无法将C#集合暴露给Classic ASP。 我试过使用IEnumerable和Array。但是我收到了“object not a collection”错误。

我的方法如下:

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

并且在经典ASP方面:

Dim obj, x 
Set obj = Server.CreateObject("Namespace.class")

For Each x in obj.GetMyObj
...

那么如何将集合传递给Classic ASP?

UPDATE:

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

public class MyEnumerable : IEnumerable
{
   private IEnumerable<MyObj> _myObj;

   .
   .
   .

    [DispId(-4)]
    public IEnumerator GetEnumerator()
    {
      _myObj.GetEnumerator();
    }
}

但是现在当我尝试访问MyObj的属性时,我收到了错误:Object required

有什么想法吗?

4 个答案:

答案 0 :(得分:6)

我认为你找到了答案;使用VB的经典ASP没有内置泛型。所以,你试图将IEnumerable<MyObj>传递给ASP,它就像一个噩梦般的mashup名称,经典ASP不知道如何使用它。

解决方案是传递非通用的IEnumerable。那么问题是序列被视为包含基本的Object实例。您必须恢复到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
   ...

答案 1 :(得分:0)

我知道这可能听起来很奇怪,但我遇到了类似的问题并通过用括号括起集合来解决它

For Each x in (obj).GetMyObj

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

答案 2 :(得分:0)

如果您收到Object required错误,请尝试以下操作:

For Each key in obj.GetMyObj
    Set x = obj.GetMyObj(key)
    Response.Write x.YOURPROPERTY
Next

答案 3 :(得分:0)

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