2016-06-07 40 views
-2

「嘿,使用參數列表或使用參數」,但問題不是來自那裏。 我有沒有參數,一個或多個整數的函數,...用戶輸入函數的名稱和參數列表,我想調用函數,並給它的列表。 對於爲例:c#通過一個列表作爲參數功能

//void AddUser(int32 age, String name) 
List<dynamic> UserList = new List<dynamic>(); 
UserList.Add(42); UserList.Add("toto"); 
String FunctionEntered = "AddPerson"; 

MyFramwork.Call(FunctionEntered, UserList); 
//gives UserList(List) 

,我不能修改函數輸入,允許其採取動態值的列表作爲參數。所以我需要一個解決方案來調用一個函數(我不知道參數的數量),並使用列表的索引1,2,...作爲第一,第二,...參數。

謝謝。 PS:不用擔心,我的框架允許我使用它的名稱調用未知函數。

編輯:我會盡力澄清,我有一個列表,我想調用一個函數與這個列表作爲參數,但我想調用的函數不採取列表作爲參數(我不能修改該功能)。 例如,我想使用List {a,b}作爲Sum(int a,int b)的參數,但我無法修改該函數,因此我無法通過Sum(int [] ab)或Sum (列表ab)和參數的數量是可變的,所以我不能調用:Sum(myList [0],myList [1])。

+0

使用反射,找到它的名字(「addPerson的」)適當的方法,然後調用該方法通過列表和其他可能的參數作爲參數。 –

+0

我真的不明白你的問題是什麼,你想達到什麼。你能澄清一下你的問題嗎? –

回答

1

像這樣的事情

 public void CallMethod(List<dynamic> @params , string methodName , Type t){ 
     var methodInfo = t.GetMethod(methodName); 
     List<object> convertedParams = new List<object>(); 
     var methodParameters = methodInfo.GetParameters(); 

     for(int i=0;i<methodParameters.Length;i++) 
     { 
      convertedParams.Add(Convert.ChangeType(@params[i] , methodParameters[i].ParameterType)); 
     } 

     var obj = Activator.CreateInstance(t); 

     methodInfo.Invoke(obj , convertedParams.ToArray()); 
    } 
+0

完美,謝謝 :) – psyked

-1

http://www.dotnetperls.com/params

見上面和下面........ SumParameters可以採取任何數量的INT參數。所以我想你可以根據你的需求進行調整。

static int SumParameters(params int[] values) 
{ 
// Loop through and sum the integers in the array. 
int total = 0; 
foreach (int value in values) 
{ 
    total += value; 
} 
return total; 
} 
+1

我無法修改原始函數,它只接受一個int和一個String作爲參數(我無法修改它以將動態列表作爲參數)。 但我有一個名單的功能,我不能給它。 – psyked

+0

如果您不能修改函數來接受參數列表,您必須創建一個包裝函數來重複調用列表中的每個項目。 – Tofystedeth

+0

你能給我一個包裝的例子嗎?我正與此struggeling: 空隙蒂蒂(params對象[]參數) { TOTO((參數); } 空隙TOTO(INT A,INT B = 0) { PackageHost.WriteDebug($「{ a + b}「); } titi(new dynamic [2] {1,1}) – psyked