У меня есть класс под названием ClassModel
. Вот как это выглядит.
class ClassModel
{
dynamic ConnListInstance;
public ClassModel() {
ConnListInstance = Activator.CreateInstance(Type.GetTypeFromProgID("PCOMM.autECLConnlist"));
}
public void checkCount() { //this shows a count of 0
Console.WriteLine(ConnListInstance.Count());
}
public void checkCountVersionTwo() { //this shows a count of 1
ConnListInstance = Activator.CreateInstance(Type.GetTypeFromProgID("PCOMM.autECLConnlist"));
Console.WriteLine(ConnListInstance.Count());
}
}
Я создал экземпляр класса на своей главной странице, объявив ClassModel obj = new ClassModel()
.
Но когда я пытаюсь вызвать метод checkCount
, он возвращает 0 вместо 1. checkCountVersionTwo
возвращает 1, но только потому, что я добавил создание экземпляра из конструктора.
Что-то не так с тем, как я создал конструктор и класс? Могу ли я узнать, почему он возвращает нулевое / пустое значение? Разве переменная ConnListInstance
не должна иметь значение при создании нового объекта ClassModel
?
Я не уверен, что это то, что вы ищете, но значение ConnListInstance равно "{System .__ ComObject}". У меня тоже нет кода Activator.CreateInstance. Судя по всему, это аналог C# метода CreateObject в VB.
Скажите, если дважды звонить в checkCountVersionTwo()
, у вас дважды 1
или 1
и 2
?
При двойном вызове checkCountVersionTwo () на выходе дважды будет 1.
А вы ничего не делаете между ClassModel obj = new ClassModel();
и obj.checkCountVersionTwo();
?
Да, я просто создаю новый объект ClassModel и вызываю метод checkCount.
Это не имеет ничего общего с вашим кодом, но причина в том, как этот объект работает.
Пожалуйста, прочтите документация:
An autECLConnList object provides a static snapshot of current connections. The list is not dynamically updated as connections are started and stopped. The Refresh method is automatically called upon construction of the autECLConnList object. If you use the autECLConnList object right after its construction, your list of connections is current. However, you should call the Refresh method in the autECLConnList object before accessing its other methods if some time has passed since its construction to ensure that you have current data. Once you have called Refresh you may begin walking through the collection
(курсив мой)
Итак, решение:
public void checkCount()
{
ConnListInstance.Refresh();
Console.WriteLine(ConnListInstance.Count());
}
Я пытался сделать, как вы сказали, и это помогло решить проблему. Спасибо, что осветили принцип работы метода!
Это полный код без каких-либо других манипуляций?
Объявление в соответствии с этим, кажется, так. Пожалуйста, добавьте дополнительный код для пояснения.
В конструкторе у вас будет действующий экземпляр, если CreateInstance не завершится по какой-либо причине.
В первом методе проверки вы получите количество объектов, которые он содержит (от времени построения до времени вызова метода).
Во втором методе проверки вы воссоздаете объект и снова получаете его количество в том же блоке. Таким образом, любое возможное время для добавления объекта в список находится в конструкторе ConnListInstance.
Следовательно, для # 2 кажется, что вы манипулируете лежащими в основе данными, и, следовательно, счетчик списка отображается как 0; тогда как во время свежего строительства он отображается как 1.
Вы пытались установить точку останова в своем методе
checkCount
, чтобы узнать, какое значение имеетConnListInstance
? Также, возможно, добавить код дляActivator.CreateInstance