我正在试验 DynamicObject
。我尝试做的一件事是设置值 ref
/out
参数,如下面的代码所示。但是,我无法拥有的价值观 i
和 j
在 Main()
设置正确(即使它们设置正确 TryInvokeMember()
)。有谁知道如何打电话给 DynamicObject
对象 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;
}
}
更新7/15: 微软声称已经修复了下一版.NET的问题 http://connect.microsoft.com/VisualStudio/feedback/details/543101/net-4-0s-dynamicobject-doesn-t-set-ref-out-arguments
2012年9月8日更新: 使用VS.NET 2012与.NET 4.0和4.5进行测试,确认:它已经修复。