Использование Отражения. Испустите для создания класса, реализовав интерфейс

парсер-генератор ANTLR имеет грамматика для C/C++, а также препроцессора. Я никогда не использовал его так, я не могу сказать, как завершенный его парсинг C++ будет. Сам ANTLR был полезным инструментом для меня в нескольких случаях для парсинга намного более простых языков.

13
задан Sam Harwell 30 October 2009 в 18:33
поделиться

4 ответа

Если вы используете Reflection.Emit, вам действительно нужно копия языковой надстройки Reflection.Emit для Reflector . Хотя он и не идеален, он должен дать вам как минимум 95% пути к любому заданному сгенерированному коду.

9
ответ дан 2 December 2019 в 00:46
поделиться

Я полагаю, AutoMapper и / или ] LinFu сделает это за вас. Вы определенно можете создать экземпляр интерфейса с помощью AutoMapper, я это сделал.

0
ответ дан 2 December 2019 в 00:46
поделиться

У меня нет под рукой компилятора, но должно работать что-то вроде этого:

var aName = new AssemblyName("temp");
var appDomain = Threading.Thread.GetDomain();
var aBuilder = appDomain.DefineDynamicAssembly(aName, AssemblyBuilderAccess.Run);
var mBuilder = aBuilder.DefineDynamicModule(aName.Name);
var tBuilder = mBuilder.DefineType("GeneratedObject", TypeAttributes.Public | TypeAttributes.Class);
tBuilder.AddInterfaceImplementation(typeof(IObject));
var methBuilder = tBuilder.DefineMethod("Get", MethodAttributes.Public | MethodAttributes.Final | MethodAttributes.Virtual);
var typeParam = mb.DefineGenericParameters(new string[] { "T" })[0];
methBuilder.SetParameters(new Type[] { typeof(string) });
methBuilder.SetReturnType(typeParam);
var ilg = methBuilder.GetILGenerator();
let lBuilder = ilg.DeclareLocal(typeParam);
ilg.Emit(OpCodes.Ldloca_S, (byte)0);
ilg.Emit(OpCodes.Initobj, typeParam);
ilg.Emit(OpCodes.Ldloc_0);
ilg.Emit(OpCodes.Ret);
var generatedType = tBuilder.CreateType();
4
ответ дан 2 December 2019 в 00:46
поделиться

Вы забыли BOX возврат:

internal delegate object FastConstructorHandler(object[] paramters);

    private static FastConstructorHandler CreateDelegate(Type Tipo)
    {
        DynamicMethod dynamicMethod = new DynamicMethod(string.Empty,
            typeof(object), new Type[] { typeof(object[]) }, Tipo.Module, false);

        ILGenerator ilg = dynamicMethod.GetILGenerator();

        ilg.DeclareLocal(Tipo);
        ilg.Emit(OpCodes.Ldloca_S, (byte)0);
        ilg.Emit(OpCodes.Initobj, Tipo);
        ilg.Emit(OpCodes.Ldloc_0);
        ilg.Emit(OpCodes.Box, Tipo);
        ilg.Emit(OpCodes.Ret);

        return (FastConstructorHandler)dynamicMethod.CreateDelegate(typeof(FastConstructorHandler));
    }
0
ответ дан 2 December 2019 в 00:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: