C# 如何使用OptionalParamBinding和命名参数调用Member?

C# 如何使用OptionalParamBinding和命名参数调用Member?,c#,.net,reflection,C#,.net,Reflection,如果我有一个具有如下可选参数的方法: public void foo(string argA, string argB = "", string argC = "") { /* ... */ } 我可以使用以下代码调用此方法,而无需传递可选的argC: Type _T = // get type; dynamic instance = Activator.CreateInstance(_T); _T.InvokeMember("foo", Bindin

如果我有一个具有如下可选参数的方法:

public void foo(string argA, string argB = "", string argC = "")
{
   /* ... */
}
我可以使用以下代码调用此方法,而无需传递可选的argC:

Type _T = // get type;

dynamic instance = Activator.CreateInstance(_T);

_T.InvokeMember("foo",
                BindingFlags.InvokeMethod | BindingFlags.OptionalParamBinding,
                null,
                instance,
                new object[] { "A", "B"},
                null,
                null,
                new string[] { "argA", "argB" });
但是,如果我只想传递argA和argC,而忽略可选的argB,这将失败,因为“System.IndexOutOfRangeException:Index超出了数组的边界。”

我意识到我可以计算出缺少的参数名称,但这首先需要建立最具体的成员(通过调用_T.GetMember)有效地复制如果是直接调用而不是通过反射所做的事情

但是,有没有一种直接在InvokeMember调用上执行此操作的方法

在后台,我正在处理的实际代码位于基于System.Dynamic.DynamicObject的类的TryInvokeMember中,该类本身被称为仅传递argA和argC


谢谢。

正在使用
Missing.Value
作为您用例的选项,相反,我试图弄乱可选参数的位置?不,因为我试图创建的DynamicObject是泛型的,对调用的方法一无所知,因此在不确定方法的情况下,不知道在何处添加Missing.Value,这是我希望尽可能避免的事情。你能吗扩展代码以表示真正的问题?
_T.InvokeMember("foo",
                BindingFlags.InvokeMethod | BindingFlags.OptionalParamBinding,
                null,
                instance,
                new object[] { "A", "C"},
                null,
                null,
                new string[] { "argA", "argC" });