LambdaExpression.CompileToMethod не работает с System.Type? - PullRequest
3 голосов
/ 09 мая 2011

Я пытаюсь сделать язык программирования.Проблема возникает при попытке скомпилировать лямбда в модуль, точнее при попытке преобразования из строки в t (некоторый тип), используя Convert.ChangeType вместо t.Parse.Если я использую LambdaExpression.Compile и использую DynamicInvoke для делегата, это работает, но если я использую CompileToMethod и генерирую модуль (abc.exe) и конвертирую, используя Convert.ChangeType, он выдает исключение при запуске модуля: System.Ошибка TypeAccessException не обработана. Сообщение = Попытка метода 'Foo.Main ()' для доступа к типу 'System.RuntimeType' завершилась неудачей.


Метод, использованный для преобразования:

        private static Expression ConvertExpression<T>(Expression exprToConvert)
    {
        Type[] types = new Type[] { typeof(object), typeof(Type) };
        MethodInfo changeTypeMethod = typeof(System.Convert).GetMethod("ChangeType", types);
        Expression convertedExprAsObject = Expression.Call(changeTypeMethod, exprToConvert, Expression.Constant(typeof(T)));      
        return Expression.Convert(convertedExprAsObject, typeof(T));
    }

1 Ответ

4 голосов
/ 18 августа 2011

Мне удалось воспроизвести полученное вами исключение (это было самое сложное :-)).Тогда я смог увидеть, если изменение следующего кода имеет значение:

 Expression.Constant(typeof(T))

на:

 Expression.Constant(typeof(T), typeof(Type))

Только с одним небольшим изменением все это, казалось, работает правильно.Создание константы типа Type делает все счастливым.

...