Подключение к HttpApplication.BeginRequest с обработчиком, сгенерированным во время выполнения, вызывает исключение NullReference

После подключения к событию HttpApplication.BeginRequest (и некоторым другим событиям HttpApplication) с созданным во время выполнения делегатом, таким как

var expr = Expression.Lambda<EventHandler>(Expression.Empty(),
    new[]
    {
        Expression.Parameter(typeof (object)),
        Expression.Parameter(typeof (EventArgs))
    });
var handler = expr.Compile();
application.BeginRequest += handler;

Я получаю ошибку:

NullReferenceException: Object reference not set to an instance of an object.]
 System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +120
  System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +114

Среда: ASP.NET 4.

Исключение исчезает, если этот делегат вызывается в другом вызове делегата:application.BeginRequest += (s, e) =>{handler(s, e);};

Этот подход не удовлетворяет меня.

Поведение кажется специфичным для HttpApplication, так как другие классы ведут себя ожидаемым образом. Может кто-нибудь пролить свет на этот вопрос, пожалуйста.

1 ответ

Выяснил, что это из-за доступа к MemberInfo.ReflectedType.ToString(), В динамических методах MemberInfo.ReflectedType имеет значение Null. ReflectionType устанавливается, если метод создается внутри сгенерированного типа с TypeBuilder.

Другие вопросы по тегам