我需要使用给定的参数数组调用给定的 DynamicObject。然而,我正在努力思考如何做到这一点。
我想做的事:
using System.Dynamic;
using System.Reflection;
InvokeDynamicObject(new A(), ((object[])["asd", 1, null]));
object? InvokeDynamicObject(DynamicObject dyn, object?[] args)
{
dyn.TryInvoke(/* what? */, args, out object? res);
return res;
}
class A : DynamicObject
{
public override bool TryInvoke(InvokeBinder binder, object?[]? args, out object? result)
{
Console.WriteLine($"Called with args {String.Join(", ", (args ?? []).Select(a => a is null ? "null" : a.GetType().Name))}");
result = null;
return true;
}
}
如果我的参数是固定的,那就很容易
((dynamic)dyn)(arg1, arg2, arg3)
但是我该如何对提供的参数数组执行此操作?
我认为我需要使用反射调用 TryInvoke,但是我为
InvokeBinder
参数提供什么?我没有找到任何方法来创建一个,我是否需要自己实现一个(以及需要做什么?)?
只要
TryInvoke
实现(如您的)不使用它,您就可以在调用它时为 null!
参数传递 InvokeBinder
。
dyn.TryInvoke(null!, args, out object? res);
总的来说,你的代码看起来不错并且可以打印
Called with args String, Int32, null
当我运行它并进行这一更改时。