Мне нужно сгенерировать интерфейс. У меня проблема с созданием (испусканием) виртуальных свойств. Кажется, они не сгенерированы.Создайте интерфейс со свойствами с 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
,
Что я делаю неправильно?
Объект не является общедоступным, вам нужно использовать BindingFlags.NonPublic | BindingFlags.Instance, чтобы найти его обратно. Я полагаю, что основная проблема заключается в том, что вы не указали, есть ли у нее геттер и сеттер. Трудно понять, как это сделать для интерфейса, я бы предположил, что вам нужно создать фиктивный метод. –