如何使用OptionalParamBinding和命名参数调用成员?

时间:2017-10-28 11:02:21

标签: 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",
                BindingFlags.InvokeMethod | BindingFlags.OptionalParamBinding,
                null,
                instance,
                new object[] { "A", "B"},
                null,
                null,
                new string[] { "argA", "argB" });

但是,如果我只想传递argA和argC,省略可选的argB,则会失败并显示“System.IndexOutOfRangeException:Index超出了数组的范围。”

_T.InvokeMember("foo",
                BindingFlags.InvokeMethod | BindingFlags.OptionalParamBinding,
                null,
                instance,
                new object[] { "A", "C"},
                null,
                null,
                new string[] { "argA", "argC" });

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

但是,有没有办法直接在InvokeMember调用上执行此操作?

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

感谢。

0 个答案:

没有答案