protected virtual MethodDefinitionExpression CreateSerializeRequestMethod() { var error = FickleExpression.Variable("NSError", "error"); var retval = FickleExpression.Variable("NSData", "retval"); var client = Expression.Parameter(FickleType.Define("PKWebServiceClient"), "client"); var requestObject = Expression.Parameter(FickleType.Define("id"), "serializeRequest"); var parameters = new[] { new FickleParameterInfo(FickleType.Define("NSDictionary"), "obj"), new FickleParameterInfo(FickleType.Define("NSJSONWritingOptions", false, true), "options"), new FickleParameterInfo(FickleType.Define("NSError"), "error", true) }; var methodInfo = new FickleMethodInfo(FickleType.Define("NSJSONSerialization"), FickleType.Define("NSData"), "dataWithJSONObject", parameters, true); var nsDataType = FickleType.Define("NSData"); var body = Fx.Block(error, retval) .If(Expression.Equal(requestObject, Expression.Constant(null, requestObject.Type))) .Assign(retval, Expression.New(FickleType.Define("NSData"))) .ElseIf(Expression.TypeIs(requestObject, typeof(string))) .Assign(retval, FickleExpression.Call(requestObject, typeof(string), "dataUsingEncoding", Expression.Variable(typeof(int), "NSUTF8StringEncoding"))) .ElseIf(Expression.TypeIs(requestObject, nsDataType)) .Assign(retval, Expression.Convert(requestObject, nsDataType)) .Else() .Assign(retval, Expression.Call(methodInfo, requestObject, Expression.Convert(Expression.Variable(typeof(int), "NSJSONReadingAllowFragments"), FickleType.Define("NSJSONWritingOptions", false, true)), error)) .EndIf() .Return(retval) .EndBlock(); return(new MethodDefinitionExpression ( "webServiceClient", new [] { client, requestObject }.ToReadOnlyCollection(), retval.Type, body, false, null )); }