public static void Build(NetworkStream stream, string jsonList) { List <string> initKeys = ConvertStringToList <string> .Convert(jsonList.Normalize()); BuilderKey.Build(initKeys); ResponseServer.SendResponse(stream, "Build Keys Succesfully"); }
private static Build CreateBuilder(Type destinationType, IDataRecord dataRecord) { Build builder; BuilderKey builderKey = new BuilderKey(destinationType, dataRecord); if (_builderCache.TryGetValue(builderKey, out builder)) { return(builder); } var method = new DynamicMethod("DynamicCreate", destinationType, new[] { typeof(IDataRecord) }, destinationType, true); var generator = method.GetILGenerator(); var result = generator.DeclareLocal(destinationType); generator.Emit(OpCodes.Newobj, destinationType.GetConstructor(Type.EmptyTypes)); generator.Emit(OpCodes.Stloc, result); for (var i = 0; i < dataRecord.FieldCount; i++) { var propertyInfo = destinationType.GetProperty(dataRecord.GetName(i), BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.Instance); var endIfLabel = generator.DefineLabel(); if (propertyInfo != null && propertyInfo.GetSetMethod(true) != null) { generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Ldc_I4, i); generator.Emit(OpCodes.Callvirt, isDBNullMethod); generator.Emit(OpCodes.Brtrue, endIfLabel); generator.Emit(OpCodes.Ldloc, result); generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Ldc_I4, i); generator.Emit(OpCodes.Callvirt, getValueMethod); if (propertyInfo.PropertyType.IsGenericType && propertyInfo.PropertyType.GetGenericTypeDefinition().Equals(typeof(Nullable <>)) ) { var nullableType = propertyInfo.PropertyType.GetGenericTypeDefinition().GetGenericArguments()[0]; if (!nullableType.IsEnum) { generator.Emit(OpCodes.Unbox_Any, propertyInfo.PropertyType); } else { generator.Emit(OpCodes.Unbox_Any, nullableType); generator.Emit(OpCodes.Newobj, propertyInfo.PropertyType); } } else { generator.Emit(OpCodes.Unbox_Any, dataRecord.GetFieldType(i)); } generator.Emit(OpCodes.Callvirt, propertyInfo.GetSetMethod(true)); generator.MarkLabel(endIfLabel); } } generator.Emit(OpCodes.Ldloc, result); generator.Emit(OpCodes.Ret); builder = (Build)method.CreateDelegate(typeof(Build)); _builderCache[builderKey] = builder; return(builder); }
private static Build CreateBuilder(Type destinationType, IDataRecord dataRecord) { Build builder; BuilderKey builderKey = new BuilderKey(destinationType, dataRecord); if (_builderCache.TryGetValue(builderKey, out builder)) { return(builder); } var drFieldNames = new List <string>(dataRecord.FieldCount); var bindingFlags = BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.Instance; var method = new DynamicMethod("DynamicCreate", destinationType, new[] { typeof(IDataRecord) }, destinationType, true); var generator = method.GetILGenerator(); var result = generator.DeclareLocal(destinationType); generator.Emit(OpCodes.Newobj, destinationType.GetConstructor(Type.EmptyTypes)); generator.Emit(OpCodes.Stloc, result); for (var i = 0; i < dataRecord.FieldCount; i++) { drFieldNames.Add(dataRecord.GetName(i)); var propertyInfo = destinationType.GetProperty(dataRecord.GetName(i), bindingFlags); GetSetProperty(dataRecord, generator, result, i, propertyInfo, OpCodes.Ldarg_0, null); } var nestedProperties = drFieldNames .Where(name => name.Contains(".")) .OrderBy(x => x) .Select(x => x.Split('.')) .ToLookup(x => string.Join(".", x.Take(x.Length - 1)), element => element.Last()); foreach (var nestedProperty in nestedProperties) { var propInfo = destinationType.GetProperty(nestedProperty.Key, bindingFlags); if (propInfo == null || !propInfo.CanWrite || propInfo.PropertyType.IsValueType()) { continue; } var prop = generator.DeclareLocal(propInfo.PropertyType); generator.Emit(OpCodes.Newobj, propInfo.PropertyType.GetConstructor(Type.EmptyTypes)); generator.Emit(OpCodes.Stloc, prop); var counter = generator.DeclareLocal(typeof(int)); foreach (var np in nestedProperty) { var drIdx = drFieldNames.IndexOf("{nestedProperty.Key}.{np}"); if (drIdx == -1) { continue; } var innerPropInfo = propInfo.PropertyType.GetProperty(np, bindingFlags); GetSetProperty(dataRecord, generator, prop, drIdx, innerPropInfo, OpCodes.Ldarg_1, counter); } // if counter > 0 set the property to the object generator.Emit(OpCodes.Ldloc, counter); generator.Emit(OpCodes.Ldc_I4_0); generator.Emit(OpCodes.Cgt); // counter > 0 generator.Emit(OpCodes.Ldc_I4_0); var endIf = generator.DefineLabel(); generator.Emit(OpCodes.Beq_S, endIf); // { result = prop; generator.Emit(OpCodes.Ldloc, result); generator.Emit(OpCodes.Ldloc, prop); generator.Emit(OpCodes.Callvirt, propInfo.GetSetMethod(true)); // } generator.MarkLabel(endIf); } generator.Emit(OpCodes.Ldloc, result); generator.Emit(OpCodes.Ret); builder = (Build)method.CreateDelegate(typeof(Build)); _builderCache[builderKey] = builder; return(builder); }
private static Build CreateBuilder(Type destinationType, IDataRecord dataRecord) { Build builder; BuilderKey builderKey = new BuilderKey(destinationType, dataRecord); if (_builderCache.TryGetValue(builderKey, out builder)) { return builder; } var method = new DynamicMethod("DynamicCreate", destinationType, new[] { typeof(IDataRecord) }, destinationType, true); var generator = method.GetILGenerator(); var result = generator.DeclareLocal(destinationType); generator.Emit(OpCodes.Newobj, destinationType.GetConstructor(Type.EmptyTypes)); generator.Emit(OpCodes.Stloc, result); for (var i = 0; i < dataRecord.FieldCount; i++) { var propertyInfo = destinationType.GetProperty(dataRecord.GetName(i), BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.Instance); var endIfLabel = generator.DefineLabel(); if (propertyInfo != null && propertyInfo.GetSetMethod(true) != null) { generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Ldc_I4, i); generator.Emit(OpCodes.Callvirt, isDBNullMethod); generator.Emit(OpCodes.Brtrue, endIfLabel); generator.Emit(OpCodes.Ldloc, result); generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Ldc_I4, i); generator.Emit(OpCodes.Callvirt, getValueMethod); if (propertyInfo.PropertyType.IsGenericType && propertyInfo.PropertyType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)) ) { var nullableType = propertyInfo.PropertyType.GetGenericTypeDefinition().GetGenericArguments()[0]; if (!nullableType.IsEnum) generator.Emit(OpCodes.Unbox_Any, propertyInfo.PropertyType); else { generator.Emit(OpCodes.Unbox_Any, nullableType); generator.Emit(OpCodes.Newobj, propertyInfo.PropertyType); } } else { generator.Emit(OpCodes.Unbox_Any, dataRecord.GetFieldType(i)); } generator.Emit(OpCodes.Callvirt, propertyInfo.GetSetMethod(true)); generator.MarkLabel(endIfLabel); } } generator.Emit(OpCodes.Ldloc, result); generator.Emit(OpCodes.Ret); builder = (Build)method.CreateDelegate(typeof(Build)); _builderCache[builderKey] = builder; return builder; }