Exemple #1
0
        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");
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
        }
Exemple #4
0
		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;
		}