title: Overriding property definitions with Reflection.Emit
body: <p>I'm trying to implement this pattern using Reflection.Emit (TypeBuilder):</p>
  
  <pre><code>public class ClassToBeProxied
  {
      public virtual object Property1 { get; set; }
  }
  
  public class Proxy : ClassToBeProxied
  {
      [AttributeToBeAdded]
      public override object Property1
      {
          get
          {
              //do something else to return the object - i.e get it from the database
              return null; //stub
          }
          set
          {
              //do something else to set the object - i.e, save it to a database
          }
      }        
  }
  </code></pre>
  
  <p>If all I were doing was intercepting the get and set methods, then this works:</p>
  
  <pre><code>PropertyInfo info = typeof(ClassToBeProxied).GetProperty("Property1", BindingFlags.Public | BindingFlags.Instance);
  {
      MethodBuilder pGet = typeBuilder.DefineMethod("get_" + info.Name, MethodAttributes.Virtual | MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, info.PropertyType, Type.EmptyTypes);
      ILGenerator pILGet = pGet.GetILGenerator();
  
      //The proxy object
      pILGet.Emit(OpCodes.Ldarg_0);
      //The database
      pILGet.Emit(OpCodes.Ldfld, database);
      //The proxy object
      pILGet.Emit(OpCodes.Ldarg_0);
      //The ObjectId to look for
      pILGet.Emit(OpCodes.Ldfld, f);
      pILGet.Emit(OpCodes.Callvirt, typeof(MongoDatabase).GetMethod("Find", BindingFlags.Public | BindingFlags.Instance, null, new Type[] { typeof(ObjectId) }, null).MakeGenericMethod(info.PropertyType));
      pILGet.Emit(OpCodes.Ret);
  
      MethodBuilder pSet = typeBuilder.DefineMethod("set_" + info.Name, MethodAttributes.Virtual | MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, null, new Type[] { info.PropertyType });
      ILGenerator pILSet = pSet.GetILGenerator();
      pILSet.Emit(OpCodes.Ldarg_0);
      pILSet.Emit(OpCodes.Ldarg_1);
      pILSet.Emit(OpCodes.Ldarg_0);
      pILSet.Emit(OpCodes.Ldfld, database);
      pILSet.Emit(OpCodes.Call, typeof(ProxyBuilder).GetMethod("SetValueHelper", BindingFlags.Public | BindingFlags.Static, null, new Type[] { typeof(object), typeof(MongoDatabase) }, null));
      pILSet.Emit(OpCodes.Stfld, f);
      pILSet.Emit(OpCodes.Ret);
  
      //Edit:  Added fix
      newProp.SetSetMethod(pSet);
      newProp.SetGetMethod(pGet);
  }
  </code></pre>
  
  <p>But what I need to do is also add an attribute to the Property.  I can't figure out how to do this. </p>
  
  <p>If I add a new PropertyDefinition:</p>
  
  <pre><code>PropertyBuilder newProp = typeBuilder.DefineProperty(info.Name, PropertyAttributes.None, info.PropertyType, Type.EmptyTypes);
  newProp.SetCustomAttribute(new CustomAttributeBuilder(typeof(AttributeToBeAdded).GetConstructor(Type.EmptyTypes), Type.EmptyTypes, new FieldInfo[0], new object[0]));
  </code></pre>
  
  <p>and then call GetProperties() on the generated type, two properties with the same name appear.  However, if I build the code by hand (as in the example above), and call typeof(Proxy).GetProperties(), only one Property (the derived class property) is visible.  This is the behavior I need, but I can't seem to get there with Reflection.Emit </p>
  
  <p>Please let me know if I need to add more info to make the question clearer.</p>