Exemplo n.º 1
0
 public static object CreateInstance(Type createType)
 {
     return(Activator.CreateInstance(GeneratedContainer.GetGenerated(createType, typeBuilder =>
     {
         BuildForType(typeBuilder, createType);
     })));
 }
Exemplo n.º 2
0
        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);
                }
            })));
        }