Коллекция C # для Classic ASP - PullRequest
       3

Коллекция C # для Classic ASP

7 голосов
/ 19 октября 2010

У меня проблемы с выставлением коллекции 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 ]

6 голосов
/ 28 октября 2010

Я думаю, что вы нашли ответ;Классический ASP с VB не имеет встроенных обобщений.Таким образом, вы пытаетесь передать IEnumerable<MyObj> в ASP, и это выглядит как кошмарное название гибридного приложения, с которым классический ASP не имеет ни малейшего понятия, как работать.Проблема в том, что последовательность обрабатывается как содержащая базовые экземпляры объекта.Вы должны вернуться к методам приведения типов до 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
   ...
0 голосов
/ 23 октября 2010

Если вы получили ошибку Object required, попробуйте следующее:

For Each key in obj.GetMyObj
    Set x = obj.GetMyObj(key)
    Response.Write x.YOURPROPERTY
Next
0 голосов
/ 27 октября 2010

Обратное проектирование может решить проблему. Попробуйте передать классическую коллекцию ASP в ASP.NET и посмотреть, какой тип объекта. Затем вы можете передать этот тип из ASP.NET в классический ASP вместо метода пробных ошибок. Если в ASP.NET нет релевантного типа, вам следует больше заняться реверс-инжинирингом и изучить двоичные данные для поиска шаблона и написания собственного метода приведения.

0 голосов
/ 21 октября 2010

Я знаю, что это может показаться странным, но у меня была похожая проблема, и я решил ее, заключив коллекцию в скобки

For Each x in (obj).GetMyObj

Не знаю, почему это будет иметь значение, но это сработало для меня ...

...