Есть ли способ для статического метода получить доступ ко всем нестатическим экземплярам класса? - PullRequest
4 голосов
/ 01 марта 2010

Это, вероятно, глупый вопрос, но я все равно его задам ... Я программирую на C # .NET. У меня есть класс, который содержит нестатический, экземпляр EventHandler. Можно ли вызвать этот EventHandler для каждого экземпляра класса, который существует из статического метода? Я знаю, что это длинный выстрел!

Ответы [ 4 ]

5 голосов
/ 01 марта 2010

Вы можете сделать это, но вам нужно будет создать статическую коллекцию всех ваших объектов:

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.
      }
   }
}

Тебе захочется остерегаться накопления "вещей". Убедитесь, что вы удалите их из списка, когда они вам больше не нужны.

4 голосов
/ 01 марта 2010

Нет, нет. По сути, нет способа найти все экземпляры класса, если вы не напишите свой собственный код для этого.

РЕДАКТИРОВАТЬ: Заинтригован о том, почему это понизили. В любом случае, чтобы добавить немного больше деталей: вам следует избегать необходимости делать это. Вы можете сделать ваш тип реализующим IDisposable, затем зарегистрироваться в статическом обработчике событий в конструкторе и отменить регистрацию в методе Dispose. Черт возьми, у вас даже может быть финализатор, который сделает это за вас, что будет стоить вам производительности, но, по крайней мере, не приведет к утечке, если вы не сможете утилизировать экземпляр.

Однако все это несколько мрачные варианты. Было бы намного лучше попытаться изменить дизайн, чтобы избежать требования. Возможно, вы можете дать нам больше информации о том, что вы пытаетесь сделать, и мы можем найти обходной путь?

1 голос
/ 01 марта 2010

Я могу ошибаться, понимая, что вы имеете в виду, но это должно быть просто ...

Это основной файл

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 голос
/ 01 марта 2010

Вы можете сделать так:

    public class MyClass{
private static List<MyClass> Instances = new List<MyClass>();

    public MyClass(){
lock(typeof(MyClass)){
Instances.Add(this);
}

}}

После этого вы можете делать с Экземплярами все, что захотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...