2015-10-01 2 views
0

Мне нужно сгенерировать интерфейс. У меня проблема с созданием (испусканием) виртуальных свойств. Кажется, они не сгенерированы.Создайте интерфейс со свойствами с Reflection.Emit

я выясняю, что я делаю что-то неправильно:

private static TypeBuilder getTypeBuilder() 
    { 
     var typeSignature = "DynamicDigitalInput"; 
     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 | 
          TypeAttributes.BeforeFieldInit | 
          TypeAttributes.AutoLayout 
          , null); 

     return tb; 
    } 

    private static void createProperty(TypeBuilder tb, string propertyName, Type propertyType) 
    { 

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

Для создания интерфейса:

TypeBuilder tb = getTypeBuilder(); 
createProperty(tb, "p1", String.GetType()); 
createProperty(tb, "p2", Int32.GetType()); 

Когда я выполняю это:

Type i = tb.CreateType(); 
System.Reflection.PropertyInfo p1 = type.GetProperty("p1"); 

p1 является null ,

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

+0

Объект не является общедоступным, вам нужно использовать BindingFlags.NonPublic | BindingFlags.Instance, чтобы найти его обратно. Я полагаю, что основная проблема заключается в том, что вы не указали, есть ли у нее геттер и сеттер. Трудно понять, как это сделать для интерфейса, я бы предположил, что вам нужно создать фиктивный метод. –

ответ

2

Свойство не определено правильно. Для того, чтобы работала GetProperty, собственность должна иметь как минимум один публичный приемник или сеттер. Прямо сейчас у меня нет даже одного геттера или сеттера, поэтому они никогда не могут быть публичными.

Итак, вы должны создать общедоступный метод get и/или общедоступный метод set (используя MethodBuilder). Попробуйте следующее:

private static void createProperty(TypeBuilder tb, string propertyName, Type propertyType) 
{ 
    PropertyBuilder propertyBuilder = tb.DefineProperty(propertyName, PropertyAttributes.HasDefault, propertyType, null); 
    MethodBuilder methodBuilder = tb.DefineMethod("get_" + propertyName, MethodAttributes.Virtual | MethodAttributes.Abstract | MethodAttributes.Public); 
    propertyBuilder.SetGetMethod(methodBuilder); 
} 
Смежные вопросы