bool TryWritePrimitive(Type type, Func <object> value, MemberInfo memberInfo, int?arrayItemIndex, XmlDictionaryString ns, XmlDictionaryString name, int nameIndex)
        {
            PrimitiveDataContract primitiveContract = PrimitiveDataContract.GetPrimitiveDataContract(type);

            if (primitiveContract == null || primitiveContract.UnderlyingType == Globals.TypeOfObject)
            {
                return(false);
            }

            object callee = null;
            var    args   = new List <object> ();

            // load xmlwriter
            if (type.IsValueType)
            {
                callee = writer;
            }
            else
            {
                callee = ctx;
                args.Add(writer);
            }
            // load primitive value
            if (value != null)
            {
                args.Add(value());
            }
            else if (memberInfo != null)
            {
                args.Add(CodeInterpreter.GetMember(memberInfo, objLocal));
            }
            else
            {
                args.Add(((Array)objLocal).GetValue(new int [] { (int)arrayItemIndex }));
            }
            // load name
            if (name != null)
            {
                args.Add(name);
            }
            else
            {
                args.Add(memberNames [nameIndex]);
            }
            // load namespace
            args.Add(ns);
            // call method to write primitive
            primitiveContract.XmlFormatWriterMethod.Invoke(callee, args.ToArray());
            return(true);
        }
        void StoreCollectionValue(object collection, Type valueType, object value, CollectionDataContract collectionContract)
        {
            if (collectionContract.Kind == CollectionKind.GenericDictionary || collectionContract.Kind == CollectionKind.Dictionary)
            {
                ClassDataContract keyValuePairContract = DataContract.GetDataContract(valueType) as ClassDataContract;
                if (keyValuePairContract == null)
                {
                    Fx.Assert("Failed to create contract for KeyValuePair type");
                }
                DataMember keyMember   = keyValuePairContract.Members [0];
                DataMember valueMember = keyValuePairContract.Members [1];
                object     pkey        = CodeInterpreter.GetMember(keyMember.MemberInfo, value);
                object     pvalue      = CodeInterpreter.GetMember(valueMember.MemberInfo, value);

                collectionContract.AddMethod.Invoke(collection, new object [] { pkey, pvalue });
            }
            else
            {
                collectionContract.AddMethod.Invoke(collection, new object [] { value });
            }
        }
        int ReadMembers(int index, ClassDataContract classContract, bool [] requiredMembers, ref int memberIndex, ref int requiredIndex)
        {
            int memberCount = (classContract.BaseContract == null) ? 0 : ReadMembers(index, classContract.BaseContract, requiredMembers,
                                                                                     ref memberIndex, ref requiredIndex);

            if (memberCount <= index && index < memberCount + classContract.Members.Count)
            {
                DataMember dataMember = classContract.Members [index - memberCount];
                Type       memberType = dataMember.MemberType;
                if (dataMember.IsRequired)
                {
                    int nextRequiredIndex = index + 1;
                    for (; nextRequiredIndex < requiredMembers.Length; nextRequiredIndex++)
                    {
                        if (requiredMembers [nextRequiredIndex])
                        {
                            break;
                        }
                    }
                    requiredIndex = nextRequiredIndex;
                }

                if (dataMember.IsGetOnlyCollection)
                {
                    var value = CodeInterpreter.GetMember(dataMember.MemberInfo, objectLocal);
                    context.StoreCollectionMemberInfo(value);
                    ReadValue(memberType, dataMember.Name, classContract.StableName.Namespace);
                }
                else
                {
                    var value = ReadValue(memberType, dataMember.Name, classContract.StableName.Namespace);
                    CodeInterpreter.SetMember(dataMember.MemberInfo, objectLocal, value);
                }
                memberIndex = index;
            }
            return(memberCount + classContract.Members.Count);
        }
 object LoadMemberValue(DataMember member)
 {
     return(CodeInterpreter.GetMember(member.MemberInfo, objLocal));
 }