Как скомпилировать делегата с помощью Mono.CSharp.Evaluator?

1

Я пытаюсь скомпилировать кусок кода C и вернуть делегат, который я могу использовать для вызова кода позже. До сих пор я пытался

eval.Compile("delegate () {}");

так же как

eval.Evaluate("delegate () {}");

Оба случая дают мне ту же ошибку:

FatalException: Cannot convert 'anonymous method' to non-delegate type 'object'
Mono.CSharp.Report.Error (Int32 code, Location loc, System.String error)
Mono.CSharp.Report.Error (Int32 code, Location loc, System.String format, System.String arg1, System.String arg2)
Mono.CSharp.AnonymousMethodExpression.CompatibleChecks (Mono.CSharp.ResolveContext ec, Mono.CSharp.TypeSpec delegate_type)
Mono.CSharp.AnonymousMethodExpression.Compatible (Mono.CSharp.ResolveContext ec, Mono.CSharp.TypeSpec type)
Mono.CSharp.Convert.ImplicitConversionStandard (Mono.CSharp.ResolveContext ec, Mono.CSharp.Expression expr, Mono.CSharp.TypeSpec target_type, Location loc, Boolean explicit_cast)
Mono.CSharp.Convert.ImplicitConversionStandard (Mono.CSharp.ResolveContext ec, Mono.CSharp.Expression expr, Mono.CSharp.TypeSpec target_type, Location loc)
Mono.CSharp.Convert.ImplicitConversion (Mono.CSharp.ResolveContext ec, Mono.CSharp.Expression expr, Mono.CSharp.TypeSpec target_type, Location loc)
Mono.CSharp.Convert.ImplicitConversionRequired (Mono.CSharp.ResolveContext ec, Mono.CSharp.Expression source, Mono.CSharp.TypeSpec target_type, Location loc)
Mono.CSharp.Assign.ResolveConversions (Mono.CSharp.ResolveContext ec)
Mono.CSharp.Assign.DoResolve (Mono.CSharp.ResolveContext ec)
Mono.CSharp.SimpleAssign.DoResolve (Mono.CSharp.ResolveContext ec)
Mono.CSharp.OptionalAssign.DoResolve (Mono.CSharp.ResolveContext ec)
Mono.CSharp.Expression.Resolve (Mono.CSharp.ResolveContext ec, ResolveFlags flags)
Rethrow as InternalErrorException: (1,1): InteractiveHost
Mono.CSharp.Method.Emit ()
Mono.CSharp.TypeDefinition.Emit ()
Mono.CSharp.ClassOrStruct.Emit ()
Mono.CSharp.Class.Emit ()
Mono.CSharp.TypeDefinition.EmitContainer ()
Mono.CSharp.Evaluator.CompileBlock (Mono.CSharp.Class host, Mono.CSharp.Undo undo, Mono.CSharp.Report Report)
Mono.CSharp.Evaluator.Compile (System.String input, Mono.CSharp.CompiledMethod& compiled)
Mono.CSharp.Evaluator.Compile (System.String input)
DynamicMonoBehaviour.SetDynamicMethod (System.String methodname, System.String code, System.Type returnType) (at Assets/Kelvin4/DynamicMonoBehaviour.cs:53)
DynamicMonoBehaviour.Awake () (at Assets/Kelvin4/DynamicMonoBehaviour.cs:37)
Теги:
mono

1 ответ

4
Лучший ответ

Анонимные методы и лямбда-выражения являются нетипизированными выражениями и не могут существовать сами по себе.

Вам нужно явно преобразовать его в тип делегата, чтобы он стал объектом:

new Action(delegate { ... })

Ещё вопросы

Сообщество Overcoder
Наверх
Меню