Возможно, вызовите инициализаторы статического типа через отражение - PullRequest
3 голосов
/ 19 сентября 2010

Итак, у меня есть этот класс

public static class MyClass
{
    static MyClass()
    {
        ...
    }
}

, который не имеет методов, полей или свойств.Все, что он делает - подключает обработчики к статическим событиям, определенным в другом месте.

Поскольку инициализатор типа никогда не вызывается, поскольку к статическому классу никогда не осуществляется доступ, события не подключаются.

Так что я надеялся, что смогу вызвать инициализатор типа через отражение ala typeof(MyClass).TypeInitializer().Invoke(...), которое взрывается, за исключением того, что MyClass является абстрактным классом.

В конце концов приложение будет иметь другие статические классыс тем же форматом, который соответствует бизнес-правилам.Перед сохранением чего-либо в БД запускаются статические события, соответствующие типу сохраняемого объекта.Поэтому, если то, что я хочу сделать, окажется невозможным, любые рекомендации по рефакторингу должны следовать этой структуре.

РЕДАКТИРОВАТЬ:

Возможно, я не совсем понял, что именно япытаюсь сделать.В основном у меня есть слой данных, где вы можете инициализировать экземпляр DataContext, а затем, когда вызывается SubmitChanges(), я проверяю ChangeSet на наличие вставок / обновлений / удалений и инициирую статические события для каждого вставляемого типа/ обновлено / удалено.Все это прекрасно работает, я просто ищу способ подключить обработчики к событиям, когда приложение запускается.Так что я играл с этим:

static DataContext()
{
    System.Reflection.Assembly.GetExecutingAssembly().GetTypes()
        .Where(t => t.Namespace == 'Data.Business')
        .ToList()
        .ForEach( t => { 
            // invoke the static TypeInitializer here,
            // so that it can wire up it's event handlers.
        });
}

Я мог бы использовать статический метод Initialize, но, поскольку они должны быть инициализированы только один раз, я подумал TypeInitializer.

РЕДАКТИРОВАТЬ 2:

Я прочитал MEF , и это действительно дает способ сделать то, что я хотел сделать.

Ответы [ 3 ]

5 голосов
/ 20 сентября 2010

Вы можете использовать метод RuntimeHelpers.RunClassConstructor для запуска статического конструктора:

RuntimeHelpers.RunClassConstructor(typeof(MyClass).TypeHandle);

Однако я настоятельно рекомендую использовать другой подход для решения вашей проблемы ... Предложение Ричарда Хейна мне кажется очень хорошим.

5 голосов
/ 19 сентября 2010

Почему бы просто не создать статический метод, то есть Initialize (), который соединяет все обработчики событий, и просто вызвать MyClass.Initialize ()?

0 голосов
/ 16 октября 2010

Сделайте следующее исправление в вашем коде:

RuntimeHelpers.RunClassConstructor(typeof(MyClass).TypeHandle); 

Надеюсь, это поможет!

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