2015-10-30 2 views
0

Я пытаюсь создать тип во время выполнения, наклеивая атрибут StuckAttribute на каждое свойство, которое я добавляю к этому типу.Добавить атрибут на свойство созданного типа времени выполнения с использованием отражения

Тип Builder:

private TypeBuilder getTypeBuilder() 
    { 
     var typeSignature = "IDynamicFlattenedType"; 
     var an = new AssemblyName(typeSignature); 

     AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.Run); 
     ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("DynamicDomain"); 
     TypeBuilder tb = moduleBuilder.DefineType(typeSignature 
          , TypeAttributes.Public | 
          TypeAttributes.Interface) | 
          TypeAttributes.Abstract | 
          TypeAttributes.AutoClass | 
          TypeAttributes.AnsiClass 
          , null); 

     return tb; 
    } 

Property Builder:

private void createProperty(TypeBuilder tb, string propertyName, Type propertyType) 
    { 
     Type[] ctorParams = new Type[] { typeof(string) }; 
     ConstructorInfo classCtorInfo = typeof(StuckAttribute).GetConstructor(ctorParams); 

     CustomAttributeBuilder myCABuilder2 = new CustomAttributeBuilder(
          classCtorInfo, 
          new object[] { DateTime.Now.ToString() }); 

     PropertyBuilder propertyBuilder = tb.DefineProperty(propertyName, PropertyAttributes.HasDefault, propertyType, null); 
     propertyBuilder.SetCustomAttribute(myCABuilder2); 

     MethodBuilder getPropMthdBldr = tb.DefineMethod("get_" + propertyName, 
      MethodAttributes.Public | 
      MethodAttributes.Abstract | 
      MethodAttributes.Virtual | 
      MethodAttributes.HideBySig | 
      MethodAttributes.NewSlot, 
      CallingConventions.HasThis, 
      propertyType, 
      Type.EmptyTypes 
     ); 
     getPropMthdBldr.SetImplementationFlags(MethodImplAttributes.Managed); 

     MethodBuilder setPropMthdBldr = 
      tb.DefineMethod("set_" + propertyName, 
       MethodAttributes.Public | 
       MethodAttributes.Abstract | 
       MethodAttributes.Virtual | 
       MethodAttributes.HideBySig | 
       MethodAttributes.NewSlot, 
       CallingConventions.HasThis, 
       null, new[] { propertyType }); 
     setPropMthdBldr.SetImplementationFlags(MethodImplAttributes.Managed); 

     propertyBuilder.SetGetMethod(getPropMthdBldr); 
     propertyBuilder.SetSetMethod(setPropMthdBldr); 
    } 

Я создал простой тест, чтобы проверить StuckAttribute на свойствах. Как вы можете видеть, я пытаюсь получить атрибуты, вызывающие GetCustomAttributes() над каждым элементом PropertyInfo.

[Test] 
public void test() 
{ 
    Type flattenedType = Reflection.Classes.FlattenClassBuilder.flattenType<TestClass>(this.classes); 

    flattenedType.Should().NotBeNull(); 

    PropertyInfo[] properties = flattenedType.GetProperties(); 
    properties.Should().NotBeEmpty().And.HaveCount(4); 

    IEnumerable<Attribute> attrs = properties[0].GetCustomAttributes(); 
    attrs.Should().NotBeEmpty(); 
} 

Однако это не удается. Он не работает при последнем утверждении:

attrs.Should().NotBeEmpty(); 

Что я делаю неправильно?

+0

Это терпит неудачу с *, что * сообщение об ошибке? Вы отлаживали его? –

+0

Сбой при проверке проверки: attrs.Should(). NotBeEmpty() '. Таким образом, свойство не имеет никакого атрибута. – Jordi

ответ

0

Это был решен:

Я создал StuckAttribute в качестве внутреннего класса. Я решил установить класс доступа как public.

Итак, мой тест проходит прямо сейчас:

PropertyInfo[] properties = flattenedType.GetProperties(); 
properties.Should().NotBeEmpty().And.HaveCount(4); 

properties.Should().OnlyContain(p => p.GetCustomAttribute<Reflection.Classes.FieldPropertyOwnerAttribute>() != null); 

 Смежные вопросы

  • Нет связанных вопросов^_^