Это первый раз, когда я занимаюсь созданием CIL, поэтому, пожалуйста, несите свое невежество. Я ищу простой DynamicMethod, который может читать поля POCO и заполнять их в object[]
. Преобразование типа не требуется. Я собрал все, что могу, могу ли вы помочь в его завершении?Как преобразовать POCO в массив с помощью CIL?
Type t = typeof(POCO);
DynamicMethod dm = new DynamicMethod("Get" + memberName,typeof(MemberType), new Type[] { objectType }, objectType);
ILGenerator il = dm.GetILGenerator();
// Load the instance of the object (argument 0) onto the stack
il.Emit(OpCodes.Ldarg_0);
// get fields
FieldInfo[] fields = t.GetFields();
// how do I create an array (object[]) at this point?
// per field
foreach (var pi in fields) {
// Load the value of the object's field (fi) onto the stack
il.Emit(OpCodes.Ldfld, fi);
// how do I add it into the array?
}
// how do I push the array onto the stack?
// return the array
il.Emit(OpCodes.Ret);
Существует простое решение с использованием деревьев выражений, которое делает вас скомпилированной лямбдой. Вы были бы заинтересованы в этом, или вы ищете специально для решения emit? – dasblinkenlight
Если вы хотите знать, как сделать что-то в IL, напишите тот же код на C# и посмотрите сгенерированный IL. – svick
@Geotarget Я думаю, что вы путаете деревья выражений LINQ и Linq. Скомпилированные деревья выражений так же быстро, как и код, который вы испускаете вручную. – dasblinkenlight