2016-06-07 14 views
-2

«Эй, используйте список параметров или используйте параметр», но проблема не возникает. У меня есть функции, которые не принимают ни одного параметра, одного или многих целых чисел ... пользователь вводит имя функции и список параметров, и я хочу вызвать функцию и предоставить ей список. Для Exemple: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 (List 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

perfect, благодаря :) – 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 и одну строку в качестве параметров (я не могу ее изменить, чтобы взять список динамики в качестве параметра). Но у меня есть список функции, и я не могу это дать. – psyked

+0

Если вы не можете изменить функцию, чтобы принять список параметров, вам придется создать функцию-обертку, чтобы повторно называть ее для каждого элемента в списке. – Tofystedeth

+0

Можете ли вы дать мне пример обертки? Я struggeling с этим: недействительными TITI (Params объекта [] арг) { Toto ((арг); } пустот Toto (Int а, б INT = 0) { PackageHost.WriteDebug ($ "{ a + b} "); } titi (новый динамический [2] {1,1}) – psyked

Смежные вопросы