public override object VisitCastExpression(CastExpression castExpression, object data) { base.VisitCastExpression(castExpression, data); // Handle methodof Match m = getMethodOrConstructorFromHandlePattern.Match(castExpression); if (m.Success) { var ilRanges = castExpression.GetAllRecursiveILRanges(); IMethod method = m.Get <AstNode>("method").Single().Annotation <IMethod>(); if (method != null && m.Has("declaringType")) { Expression newNode = m.Get <AstType>("declaringType").Single().Detach().Member(method.Name, method); newNode = newNode.Invoke(method.MethodSig.GetParameters().Select(p => new TypeReferenceExpression(AstBuilder.ConvertType(p, stringBuilder)))); newNode.AddAnnotation(method); m.Get <AstNode>("method").Single().ReplaceWith(newNode); } castExpression.ReplaceWith(m.Get <AstNode>("ldtokenNode").Single().WithAnnotation(ilRanges)); } return(null); }