Tipo de retorno DLR

Necesito un poco de ayuda DLR. Estoy implementando un IDynamicMetaObjectProvider y DynamicMetaObject pero tengo algunos problemas para obtener el tipo de retorno esperado. Estoy sobrescribiendo a BindInvokeMember en el metaobjeto, puedo ver todos los tipos de argumentos pero ningún tipo de retorno. Alguien sabe como llego a eso si es posible? Sé que el tipo de retorno es dynamic, pero qué pasa si lo que está invocando depende de un tipo de retorno. No sé qué acción realizar en DynamicMetaObject a menos que sepa el tipo de devolución que el consumidor espera.

Actualización dos

No puedo pegar mi código actual aquí, ya que llama a todo tipo de cosas de trabajo. A continuación se muestra una muestra de código de objeto dynamic.

public class TestDynamicMetaObject : DynamicMetaObject { public TestDynamicMetaObject(Expression expression, object value) : base (expression, BindingRestrictions.Empty, value) { } public override DynamicMetaObject BindInvokeMember(InvokeMemberBinder binder, DynamicMetaObject[] args) { Delegate method = new Func(Test); return new DynamicMetaObject( Expression.Call(method.Method), BindingRestrictions.GetInstanceRestriction(Expression,Value), Value ); } public static int Test() { return 10; } } public class TestDynamicObject : IDynamicMetaObjectProvider { DynamicMetaObject IDynamicMetaObjectProvider.GetMetaObject(Expression parameter) { return new TestDynamicMetaObject(parameter, this); } } 

Aquí es donde estoy usando.

 static void Main(string[] args) { try { dynamic x = new TestDynamicObject(); int gg= x.Test(); Console.WriteLine(gg); } catch (Exception excep) { Console.WriteLine(excep); } Console.ReadLine(); } 

Aquí está el código que crea el comstackdor.

 private static void Main(string[] args) { try { object x = new TestDynamicObject(); if (o__SiteContainer0.p__Site1 == null) { o__SiteContainer0.p__Site1 = CallSite<Func>.Create(new CSharpConvertBinder(typeof(int), CSharpConversionKind.ImplicitConversion, false)); } if (o__SiteContainer0.p__Site2 == null) { o__SiteContainer0.p__Site2 = CallSite<Func>.Create(new CSharpInvokeMemberBinder(CSharpCallFlags.None, "Test", typeof(Program), null, new CSharpArgumentInfo[] { new CSharpArgumentInfo(CSharpArgumentInfoFlags.None, null) })); } Console.WriteLine(o__SiteContainer0.p__Site1.Target(o__SiteContainer0.p__Site1, o__SiteContainer0.p__Site2.Target(o__SiteContainer0.p__Site2, x))); } catch (Exception excep) { Console.WriteLine(excep); } Console.ReadLine(); } 

Para los binarios estándar que devuelven algo, el tipo de retorno casi siempre es objeto (obtener, establecer, operaciones, etc.). De lo contrario, es nulo para los enlaces estándar (por ejemplo, DeleteMember).

También puede obtener el tipo de retorno esperado en tiempo de ejecución de la propiedad ReturnType en el archivador entrante.

Parece que el tipo de retorno al menos es la versión beta que estaba usando no se sabe …

Estaba tratando de hacer un ejemplo de ap / invoke usando el DLR pero parece que esto no es posible a menos que pase el tipo de retorno esperado como un parámetro que terminé haciendo: \ Esto me parece una limitación … Esperemos que será abordado en el futuro.