2012-11-13 87 views
0

我正在實施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") 

我有testtest2,也something,但我無法獲得somethingtest2test沒有名稱的信息。

+2

你應該假設最後一個參數如果有的話對應於最後的方法參數等等。 – user629926

+0

@ user629926感謝您的指針。我用它來獲取下面的代碼。如果你願意,你仍然可以添加答案,我會接受。 – manojlds

回答

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))); 
+0

可能簡化代碼的一個選擇是使用'var allNames = Enumerable.Repeat(null,numberOfArguments - numberOfNames).Concat(names);'。然後,您可以使用'Enumerable.Zip'來配對值和名稱,'null'用於未命名的參數。 –

+0

@JonSkeet好啊。我確實重構了上面的代碼,但是這很整潔。 – manojlds