我正在实施DynamicObject
。在TryInvokeMethod
中,除了参数(传入方法)之外,如果参数已经被使用,我还需要参数的名称。
我可以看到binder.CallInfo.ArgumentNames
确实提供了名称,但我无法将它们与值相关联。有没有办法这样做,或者我希望不希望:
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
var names = binder.CallInfo.ArgumentNames;
foreach (var arg in args)
{
arguments.Add(new Argument(arg));
}
//I need to associate the names and the args
result = this;
return true;
}
例如,如果我进行如下调用:
myDynamicObject.DynamicInvoke("test", something: "test2")
我有test
和test2
以及something
,但我无法获得something
是test2
的名称的信息test
没有名字。
答案 0 :(得分:2)
我不得不使用这样一个事实,即命名参数只有在指定了非命名参数后才会出现(感谢user629926指向显而易见的)和初始代码:
var names = binder.CallInfo.ArgumentNames;
var numberOfArguments = binder.CallInfo.ArgumentCount;
var numberOfNames = names.Count;
var allNames = Enumerable.Repeat<string>(null, numberOfArguments - numberOfNames).Concat(names);
arguments.AddRange(allNames.Zip(args, (flag, value) => new Argument(flag, value)));