Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Reflection;
- using System.Reflection.Emit;
- public class Populator<T>
- {
- private delegate T Load(Dictionary<string, object> properties);
- private Load _handler;
- private Populator() { }
- public T Build(Dictionary<string, object> properties)
- {
- return _handler(properties);
- }
- public static Populator<T> CreateBuilder(Dictionary<string, object> properties)
- {
- //private static readonly MethodInfo getValueMethod = typeof(IDataRecord).GetMethod("get_Item", new [] { typeof(int) });
- //private static readonly MethodInfo isDBNullMethod = typeof(IDataRecord).GetMethod("IsDBNull", new [] { typeof(int) });
- Populator<T> dynamicBuilder = new Populator<T>();
- DynamicMethod method = new DynamicMethod("Create", typeof(T), new[] { typeof(Dictionary<string, object>) }, typeof(T), true);
- ILGenerator generator = method.GetILGenerator();
- LocalBuilder result = generator.DeclareLocal(typeof(T));
- generator.Emit(OpCodes.Newobj, typeof(T).GetConstructor(Type.EmptyTypes));
- generator.Emit(OpCodes.Stloc, result);
- int i = 0;
- foreach (var property in properties)
- {
- PropertyInfo propertyInfo = typeof(T).GetProperty(property.Key, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.FlattenHierarchy | BindingFlags.Default);
- Label endIfLabel = generator.DefineLabel();
- if (propertyInfo != null && propertyInfo.GetSetMethod() != 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);
- generator.Emit(OpCodes.Unbox_Any, property.Value.GetType());
- generator.Emit(OpCodes.Callvirt, propertyInfo.GetSetMethod());
- generator.MarkLabel(endIfLabel);
- }
- i++;
- }
- generator.Emit(OpCodes.Ldloc, result);
- generator.Emit(OpCodes.Ret);
- dynamicBuilder._handler = (Load)method.CreateDelegate(typeof(Load));
- return dynamicBuilder;
- }
- }
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using Hyper.ComponentModel;
- namespace Test
- {
- class Person
- {
- public int Id { get; set; }
- public string Name { get; set; }
- }
- class Program
- {
- static void Main()
- {
- HyperTypeDescriptionProvider.Add(typeof(Person));
- var properties = new Dictionary<string, object> { { "Id", 10 }, { "Name", "Fred Flintstone" } };
- Person person = new Person();
- DynamicUpdate(person, properties);
- Console.WriteLine("Id: {0}; Name: {1}", person.Id, person.Name);
- Console.ReadKey();
- }
- public static void DynamicUpdate<T>(T entity, Dictionary<string, object> properties)
- {
- foreach (PropertyDescriptor propertyDescriptor in TypeDescriptor.GetProperties(typeof(T)))
- if (properties.ContainsKey(propertyDescriptor.Name))
- propertyDescriptor.SetValue(entity, properties[propertyDescriptor.Name]);
- }
- }
- }
- public static IEnumerable<T> Read<T>(IDataReader reader) where T : class, new()
- {
- PropertyDescriptorCollection props =
- TypeDescriptor.GetProperties(typeof(T));
- PropertyDescriptor[] propArray = new PropertyDescriptor[reader.FieldCount];
- for (int i = 0; i < propArray.Length; i++)
- {
- propArray[i] = props[reader.GetName(i)];
- }
- while(reader.Read()) {
- T item = new T();
- for (int i = 0; i < propArray.Length; i++)
- {
- object value = reader.IsDBNull(i) ? null : reader[i];
- propArray[i].SetValue(item, value);
- }
- yield return item;
- }
- }
- for (int i = 0; i < dataRecord.FieldCount; i++)
- {
- PropertyInfo propertyInfo = t.GetProperty(dataRecord.GetName(i));
- LocalBuilder il_P = generator.DeclareLocal(typeof(PropertyInfo));
- Label endIfLabel = generator.DefineLabel();
Add Comment
Please, Sign In to add comment