Это, наверное, немой вопрос, но я все равно его спрошу ... Я программирую на C# .NET. У меня есть класс, который содержит нестатический экземпляр EventHandler. Возможно ли инициировать этот EventHandler для каждого экземпляра класса, который существует из статического метода? Я знаю, что это длинный выстрел!Есть ли способ статического метода получить доступ ко всем нестатическим экземплярам класса?
ответ
Вы можете сделать это, но вам нужно создать статическую коллекцию всех объектов:
public class Thing
{
public static List<Thing> _things = new List<Thing>();
public Thing()
{
_things.Add(this);
}
public static void SomeEventHandler(object value, EventHandler e)
{
foreach (Thing thing in _things)
{
// do something.
}
}
}
Вы хотите, чтобы следить за накапливая также могут «Вещи». Убедитесь, что вы удалите их из списка, когда они вам больше не нужны.
... хотя вы можете захотеть сделать их слабыми ссылками вместо ... ...и удалите их, по крайней мере, в финализаторах ... и добавьте remix 'lock()', если ваши Вещи будут созданы на нескольких потоках ... которые вы не знаете заранее в большинстве библиотечных ситуаций ... –
Просто имейте в виду что вы можете создать экземпляр без вызова конструктора: http://stackoverflow.com/questions/296584/c-create-object-instance-without-invoking-constructor –
Нет, нет. В принципе, нет возможности найти все экземпляры класса, если вы не написали свой собственный код для этого.
РЕДАКТИРОВАТЬ: Заинтересованность в том, почему это занижено. В любом случае, чтобы добавить немного больше деталей, вам следует избегать необходимости этого. Вы можете сделать свой тип реализации IDisposable
, а затем зарегистрироваться в статическом обработчике событий в конструкторе и отменить регистрацию в методе Dispose
. Черт, у вас может даже быть финализатор, который сделает это за вас, что будет стоить вам производительности, но, по крайней мере, не будет утечки, если вы не захотите распоряжаться экземпляром.
Однако все это несколько мрачные варианты. Было бы гораздо лучше попытаться перепроектировать, чтобы избежать требования. Возможно, вы можете предоставить нам больше информации о том, что вы пытаетесь сделать, и мы можем придумать обходное решение?
+1 - это причина для редизайна, а не просто кода. Наличие экземпляров класса для подписки на наблюдателя вместо того, чтобы пытаться вызвать статический обработчик событий на каждом из них, имеет немного больше смысла, учитывая ограниченную информацию –
+1 никаких оснований понижать голос. –
Вы можете сделать так:
public class MyClass{
private static List<MyClass> Instances = new List<MyClass>();
public MyClass(){
lock(typeof(MyClass)){
Instances.Add(this);
}
}}
После этого вы можете делать все, что вы хотите с экземплярами.
... и у вас будет утечка памяти, если только вы 're * really care *, чтобы всегда быть уверенным, что вы удаляете вещи. О, и поскольку поле является общедоступным, все, что использует его, также должно быть осторожным в синхронизации :( –
Я редактирую, чтобы установить поле как личное. Дэвид хочет сделать что-то со всем экземпляром, поэтому он должен быть осторожным в отношении утечка памяти. –
я мог бы неправильно понять, что вы имеете в виду, но это должно быть просто ...
Это главный файл
using System;
using IdeaClass;
namespace TestIdeas
{
class Program
{
static void Main(string[] args)
{
Ideas i = new Ideas();
Ideas.triggerMany();
Console.ReadLine();
}
}
}
Тогда есть класс Идеи:
using System;
namespace IdeaClass
{
public class Ideas
{
static OtherClass oc = new OtherClass();
public static void triggerMany()
{
oc.runThing("textual");
}
public Ideas()
{
Ideas.oc.ThingEvent += DoThingHandler;
}
public void DoThingHandler(string thing)
{
System.Console.WriteLine(thing);
}
}
}
А потом другой класс.
using System;
namespace IdeaClass
{
class OtherClass
{
public delegate void DoThing(string text);
public event DoThing ThingEvent;
public void runThing(string text)
{
if (ThingEvent != null)
{
ThingEvent(text);
}
}
}
}
Это вызывает неудачную связь между классом, который вызывает событие и класс со статическим вызовом, но это, кажется, что вы хотите.
- 1. Доступ ко всем экземплярам класса при отладке
- 2. Есть ли способ получить доступ ко всем экземплярам из одного экземпляра во время обновления приложения?
- 3. Применение метода ко всем экземплярам класса внутри списка
- 4. Любой экземпляр доступа ко всем экземплярам (класса)
- 5. Есть ли способ установить переменную класса для применения ко всем экземплярам этого класса в php?
- 6. Есть ли способ получить доступ ко всем уведомлениям Android?
- 7. Как получить доступ ко всем элементам класса?
- 8. Есть ли способ получить доступ ко всем контроллерам из метода действий, чтобы просмотреть ControllerDescriptor?
- 9. Есть ли способ вызова нестатического метода из статического метода?
- 10. GAE отправляет запросы ко всем активным экземплярам
- 11. Приложить метод ко всем экземплярам jqgrid?
- 12. применить класс css ко всем экземплярам
- 13. Есть ли способ применить [TestMethod] ко всем методам, использующим класс
- 14. Есть ли способ отправить HTTP-запрос ко всем экземплярам в ELS AWS?
- 15. В ActionScript, можно ли вызвать функцию класса, которая применяется ко всем экземплярам этого класса?
- 16. Как получить доступ ко всем конкретным версиям общего статического класса в C#?
- 17. QT, доступ ко всем данным другого класса
- 18. Есть ли способ загрузить некоторые действия ко всем моим сервлетам?
- 19. Доступ ко всем контроллерам директивы
- 20. Как настроить консоль aws для доступа ко всем экземплярам
- 21. Доступ ко всем функциям argmuments
- 22. Доступ ко всем записям HttpParams
- 23. Есть ли способ получить доступ ко всем переменным в рабочей области последовательно?
- 24. Есть ли способ получить доступ ко всем переменным определенного типа в классе?
- 25. Есть ли способ получить доступ ко всем слушателям fs.watch для процесса?
- 26. Есть ли способ получить доступ ко всем функциям Clib из одного файла?
- 27. Доступ ко всем паролям в keychain iCloud
- 28. Можно ли получить Семантический (emacs) автоматический доступ ко всем файлам?
- 29. Как добавить атрибуты ко всем экземплярам виджета формы django?
- 30. Любой способ применения staticmethod ко всем методам класса?
Это довольно запутанно. Похоже, вы хотите вызвать обработчик события экземпляра из любого другого экземпляра типа. Другими словами, каждый экземпляр вызовет обработчик событий для каждого другого экземпляра созданного класса ... это правильно? –
Наблюдатель паттен на помощь? –
Хотя есть ответы, которые могут сработать, вы можете рассмотреть вопрос о расширении вопроса, чтобы описать свой сценарий немного больше; возможно, более элегантное решение, такое как шаблон наблюдателя или даже Rx, если вы можете использовать лицензию GoLive, может быть хорошо подходит для вашей проблемы. –