Показать сообщение отдельно
Старый 20.09.2013, 13:56   #1
Reizel
Задрот
 
Аватар для Reizel
 
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений
(для 863 пользователей)
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 нужен, и необходимо запустить его статический конструктор в любом случае, в независимости от внешнего использования?
(Offline)
 
Ответить с цитированием