/// <summary> /// /// </summary> /// <param name="membersOrder">Defines the declaration order of each property and field (because it is not guaranteed by the typeof(T).GetMembers() method)</param> public DataTransformer(Func <Type, MemberInfo, int> membersOrder) { if (!DataType.IsPrimitiveType(typeof(T)) && typeof(T).IsClass && typeof(T).GetConstructor(new Type[] { }) == null) { throw new NotSupportedException(String.Format("Type '{0}' does not have a default constructor", typeof(T))); } MembersOrder = membersOrder; List <Type> list = new List <Type>(); BuildSlotTypes(list, typeof(T), new HashSet <Type>()); slotTypes = list.ToArray(); if (slotTypes.Length == 0) { throw new ArgumentException(String.Format("No public read/write properties/fields available for mapping.")); } Type = DataTypeUtils.GetDataType(slotTypes); DataType = DataTypeUtils.FromPrimitiveTypes(slotTypes); LambdaToIData = CreateToIDataMethod(); toIData = LambdaToIData.Compile(); LambdaFromIData = CreateFromIDataMethod(); fromIData = LambdaFromIData.Compile(); }