如果我有一个具有可选参数的方法,如下所示:
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。
感谢。