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)); }