Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > ссылка записывается в эллемент коллекции!


Автор: Demokratizator 2.10.2007, 00:30
Добрый день.

Такой код:
Код


ArrayList _fResult = new ArrayList();
AV8Document _Item = (AV8Document)_ci[0].Invoke(new object[] { _connection });
object _v8Select = _Item._itemManager.GetType().InvokeMember("Select",
                                                                       System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.InvokeMethod |   
                                                                       System.Reflection.BindingFlags.Static,
                                                                       null,
                                                                       _Item._itemManager,
                                                                       new object[] { });


while (((bool)_v8Select.GetType().InvokeMember("Next", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Static, null, _v8Select, null)))
{
       _fResult.Add(_v8Select);
}

return _fResult;


т.е. в цикле должны добавляются элементы к коллекцию. НО происходит следеющее: 
на первой итерации цикла _fResult[0] равно одному значению
на второй итерации _fResult[1] равно другому значению, НО и _fResult[0] получается равным _fResult[1], хотя _v8Select на первой итерации НЕ равно _v8Select на второй. и так далее. Т.е. в конце получаю коллекцию, все элементы которой равны последнему значению...
Я так понял, что  _v8Select записывается в коллекцию как ссылка и поэтому меняется... как туда запихивать именно значение?
Спасибо.


Автор: archeg 2.10.2007, 00:46
Какого у тебя типа _v8Select? bool?

Автор: Demokratizator 2.10.2007, 01:57
это вообще COM объект.

сдесь инициализируется:
Код

object _v8Select = _Item._itemManager.GetType().InvokeMember("Select",
                                                                       System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.InvokeMethod |   
                                                                       System.Reflection.BindingFlags.Static,
                                                                       null,
                                                                       _Item._itemManager,
                                                                       new object[] { });


сдесь вызывается его метод, который возвращает bool:
Код

((bool)_v8Select.GetType().InvokeMember("Next", 
System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Static, 
null, _v8Select, null))


Автор: archeg 2.10.2007, 07:24
Ну вот. Тогда объясни ты мне как ты хочешь скопировать COM-объект? оО smile 

Автор: stab 2.10.2007, 07:59
Цитата(Demokratizator @  2.10.2007,  04:30 Найти цитируемый пост)
Я так понял, что  _v8Select записывается в коллекцию как ссылка и поэтому меняется... как туда запихивать именно значение?


видима каждый раз производя создание нового объекта, т.е.

Код

object _v8Select = _Item._itemManager.GetType().InvokeMember("Select",
                                                                       System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.InvokeMethod |   
                                                                       System.Reflection.BindingFlags.Static,
                                                                       null,
                                                                       _Item._itemManager,
                                                                       new object[] { });


надо внести в цикл.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)