Подключение к 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.