Мой код:Возможно ли в C# знать, кто вызвал статическое свойство/accessor?
public class CLASS_A {
public static Dictionary<int, CLASS_A> List = new Dictionary<int, CLASS_A>;
public static PP_CLASS pp = null;
public static CLASS_A ID
{
get
{
int key = get_threadID;
if (List.ContainsKey(key))
return List[key];
else
return null;
}
set
{
int key = get_threadID;
List[key] = value;
}
}
public virtual void init(lib, name)
{
...
if (name != "")
{
if (pp == null)
PP = this;
}
...
}
}
Так какой поток вызывает первонач, это идентификатор используется для хранения этого (кто называется). Например, мой список выглядит следующим образом:
45 = CLASS_A_object0
67 = CLASS_A_object1
...
Но теперь, когда другой поток вызывает метод на стр, скажет CLASS_A.pp.setWelcome
, это вернет нуль рра, и бросает исключение нулевого! Потому что когда set называется, идентификатор потока будет другим и не будет в списке.
Возможно ли, что я знаю, какой объект называется так, чтобы я мог делать обратный поиск? Или, может быть, другое решение?
Зачем мне это нужно: Первоначально мы подключались к одному устройству, чтобы это было нормально. Теперь есть несколько устройств, каждый из которых имеет свой собственный ip/port. Первоначальный код имел только public static PP_CLASS pp = null;
Так что другие будут просто вызывать методы на pp, используя имя класса, и все было хорошо.
Предыдущее поведение: Программное обеспечение выбирает список устройств из файла, а так как pp статично, он разговаривает только с первым устройством. Я добавил, что строка pp==null
, которую я забыл в своем первом сообщении. Поэтому при запуске кода pp==null
будет истинным, а первое устройство будет назначено, но теперь для других устройств pp==null
будет ложным, и поэтому я не могу разговаривать с другими устройствами.
Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.
Вы можете изменить свойство метода и добавить аргумент для «вызывающего абонента»? Затем просто выполните все ошибки, которые компилятор бросает на вас. – MrMoDoJoJr
Из вашего вопроса неясно, что вы хотите, если один поток вызывает 'init', а другой поток пытается использовать' pp'. –
Расскажите нам еще о вашем прецеденте. Почему вы хотите сохранить свои объекты с помощью потока в качестве ключа? У вас не будет отдельного экземпляра PP для потока, у вас будет общий PP для всех потоков после вызова PP. Это не имеет особого смысла, поскольку это означает, что PP и ваше свойство ID не имеют никаких отношений. Мне интересно, если вы ищете ThreadStatic: http://msdn.microsoft.com/en-us/library/system.threadstaticattribute.aspx. Кроме того - использование List в качестве идентификатора не очень хорошо. – SamStephens