public static object CreateInstance(Type createType) { return(Activator.CreateInstance(GeneratedContainer.GetGenerated(createType, typeBuilder => { BuildForType(typeBuilder, createType); }))); }
public static T CreateInstance <T>() where T : AutoNotifyPropertyChanged { return((T)Activator.CreateInstance(GeneratedContainer <T> .GetGenerated(typeBuilder => { typeBuilder.SetParent(typeof(T)); foreach (var propertyInfo in typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public)) { if (propertyInfo.GetCustomAttributes(true).OfType <SuppressNotifyAttribute>().Any()) { continue; } var name = propertyInfo.GetCustomAttributes(true).OfType <PropertyNameAttribute>().Select(a => a.Name).FirstOrDefault() ?? propertyInfo.Name; var setterInfo = propertyInfo.GetSetMethod(); if (setterInfo == null) { continue; } if (!setterInfo.IsAbstract && !setterInfo.IsVirtual) { throw new InvalidProgramException("Property " + propertyInfo.Name + " of type " + typeof(T).Name + " should be virtual or abstract"); } FieldInfo field = null; if (setterInfo.IsAbstract) { field = typeBuilder.DefineField("k_____" + name, propertyInfo.PropertyType, FieldAttributes.Private); } var setter = typeBuilder.DefineMethod("set_" + name, PropertyAttrs, typeof(void), new[] { propertyInfo.PropertyType }); var setterIl = setter.GetILGenerator(); setterIl.Emit(OpCodes.Ldarg_0); setterIl.Emit(OpCodes.Ldarg_1); if (field != null) { setterIl.Emit(OpCodes.Stfld, field); } else { setterIl.Emit(OpCodes.Call, setterInfo); } setterIl.Emit(OpCodes.Ldarg_0); setterIl.Emit(OpCodes.Ldstr, name); setterIl.Emit(OpCodes.Call, RaisePropertyChangedInfo); setterIl.Emit(OpCodes.Ret); typeBuilder.DefineMethodOverride(setter, setterInfo); var getterInfo = propertyInfo.GetGetMethod(true); var getter = typeBuilder.DefineMethod("get_" + name, PropertyAttrs, propertyInfo.PropertyType, Type.EmptyTypes); var getterIl = getter.GetILGenerator(); getterIl.Emit(OpCodes.Ldarg_0); if (field != null) { getterIl.Emit(OpCodes.Ldfld, field); } else { getterIl.Emit(OpCodes.Call, getterInfo); } getterIl.Emit(OpCodes.Ret); typeBuilder.DefineMethodOverride(getter, getterInfo); var newProp = typeBuilder.DefineProperty(name, PropertyAttributes.None, propertyInfo.PropertyType, Type.EmptyTypes); newProp.SetGetMethod(getter); newProp.SetSetMethod(setter); } }))); }