forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   С# (http://forum.boolean.name/forumdisplay.php?f=128)
-   -   Static constructor execution (http://forum.boolean.name/showthread.php?t=18550)

Reizel 20.09.2013 13:56

Static constructor execution
 
У меня есть класс PrototypeCollector, синглтон. он нужен для коллекционирования классов, которые хотят пассивно создавать свои экземпляры извне. Сейчас поясню, для чего это нужно


Код:

class PrototypeCollector
    {
        //INTERFACE
        List<dynamic> prototypes = new List<dynamic>();
        int commonPercentage = 0;
        public void AddPrototype(Type t,int p)
        {
            prototypes.Add(new
            {
                type = t,
                percentage = p
            });
            commonPercentage = 0;
            prototypes.ForEach((pr) => commonPercentage += pr.percentage);
            Console.WriteLine("Common percentage: {0}", commonPercentage);
        }
        public void PrintDiagram()
        {
            Console.WriteLine("Report about added classes:");
            prototypes.ForEach((dynamic p) =>
            {
                Console.WriteLine("Class: {0} | Percentage: {1}",p.type.ToString(),p.percentage.ToString());
            });
            Console.WriteLine("==--==");
        }
        //==================================
        public static PrototypeCollector Instance
        {
            get;
            private set;
        }
        private PrototypeCollector()
        {
            Instance = this;
        }
        static PrototypeCollector()
        {
            new PrototypeCollector();
        }
    }



И есть класс Circle, который хочет без всякого лишнего кода "добавиться" в коллекцию прототипов синглтона:


Код:

class Circle
    {
        static Circle()
        {
            PrototypeCollector.Instance.AddPrototype(typeof(Circle), 20);
        }
    }



Нужно, чтоб этот статический конструктор вызывался в любом случае, так как явного вызова конструкторов класса Circle не будет (они будут создаваться PrototypeCollector'ом рефлексивно), соответственно, компилятор не видит явной нужды в классе Circle. Такое чувство, что он "забивает" на него. Считает лишним (ну раз его никто извне не использует и не вызывает)

Вопрос: как мне объяснить компилятору, что класс Circle нужен, и необходимо запустить его статический конструктор в любом случае, в независимости от внешнего использования?

pax 20.09.2013 18:42

Ответ: Static constructor execution
 
Разве что попробовать рефлексией пройти по всем сборкам в домене приложения и получить данные о типах... и то я не знаю, сработает ли конструктор или нет.

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


Часовой пояс GMT +4, время: 03:14.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot