Estoy experimentando con DynamicObject
. Una de las cosas que trato de hacer es establecer los valores de ref
/out
argumentos, como se muestra en el siguiente código. Sin embargo, no puedo tener los valores de i
y j
en Main()
configurados correctamente (aunque están configurados correctamente en TryInvokeMember()
). ¿Alguien sabe cómo llamar a un objeto DynamicObject
con argumentos ref
/out
y ser capaz de recuperar los valores establecidos dentro del método?C# 4.0 'dinámico' no establece argumentos de ref/out
class Program
{
static void Main(string[] args)
{
dynamic proxy = new Proxy(new Target());
int i = 10;
int j = 20;
proxy.Wrap(ref i, ref j);
Console.WriteLine(i + ":" + j); // Print "10:20" while expect "20:10"
}
}
class Proxy : DynamicObject
{
private readonly Target target;
public Proxy(Target target)
{
this.target = target;
}
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
int i = (int) args[0];
int j = (int) args[1];
target.Swap(ref i, ref j);
args[0] = i;
args[1] = j;
result = null;
return true;
}
}
class Target
{
public void Swap(ref int i, ref int j)
{
int tmp = i;
i = j;
j = tmp;
}
}
actualización 7/15: Microsoft afirma haber solucionado el problema para la próxima versión de .NET http://connect.microsoft.com/VisualStudio/feedback/details/543101/net-4-0s-dynamicobject-doesn-t-set-ref-out-arguments
Actualización 08/09/2012: Probado utilizando VS.NET 2012 con .NET 4.0 y 4.5, confirme: ya está arreglado.
Duplicado exacto: http: // stackoverflow.com/questions/2268857/c-4-determination-parameter-passing-semántica-in-dynamic-calls – Gabe
@gabe: En realidad, vi esa pregunta, pero esa pregunta era si se podía saber si un parámetro se podía conocer como aprobado por ref/out o no, que es completamente diferente de lo que estoy preguntando aquí. No estoy interesado en eso en mi caso porque puedo pensar con un poco de reflexión en la clase 'Target'. –
Aunque su pregunta es diferente, la respuesta a eso incluye la respuesta a su pregunta: * DynamicObject es "call-by-value" * – Gabe