C# 动态对象使用未知参数数组调用 TryInvoke

问题描述 投票:0回答:1

我需要使用给定的参数数组调用给定的 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
参数提供什么?我没有找到任何方法来创建一个,我是否需要自己实现一个(以及需要做什么?)?

c# reflection system.reflection dynamicobject
1个回答
0
投票

只要

TryInvoke
实现(如您的)不使用它,您就可以在调用它时为
null!
参数传递
InvokeBinder

dyn.TryInvoke(null!, args, out object? res);

总的来说,你的代码看起来不错并且可以打印

Called with args String, Int32, null

当我运行它并进行这一更改时。

© www.soinside.com 2019 - 2024. All rights reserved.