2012-01-11 4 views
1

Как передать список значений в функцию, где значения уже сохранены в списке, а функция не является одинаковой каждый раз?Передача элементов списка в функцию

Чтобы объяснить, у меня есть список нескольких различных типов пользовательских объектов (A List<object>, чтобы сделать это), и я хочу передать эти объекты в функцию. Однако функция не всегда одна и та же. Я мог бы иметь несколько различных функций, и, полагая, что содержимое List всегда будет соответствовать входным переменным функции, я хочу, чтобы передать содержимое списка в мою функцию.

Следующий код является примером того, что может работать, но один недостаток:

List<object> myListOfVariables = new List<object>(); 
myListOfVariables.Add("Hello, world!"); 
myListOfVariables.Add(10); 

void SayHelloXTimes(string helloString, int x) { 
    for(int i = 0;i<x;i++) { 
     print(helloString) 
    } 
} 

SayHelloXTimes(myListOfVariables[0], myListOfVariables[1]); 

Теперь, так как я знаю, что мой список всегда будет содержать нужное количество переменных в правой позиции, что будет работать , если бы у меня была только одна функция. Но проблема в том, что мне нужно расширить это, чтобы я мог разделить мой список и передать его в функции с разными параметрами.

По другим причинам, я знаю, что мой список всегда будет иметь правильное количество переменных в правильных положениях, поэтому нам не нужно об этом беспокоиться. Я также знаю имя функции, в которой мне нужно передать мои значения. Я предполагаю, что я мог бы сделать загрузку из if операторов в зависимости от длины моего списка, как это:

if (myListOfVariables.Length == 2) { 
    SayHelloXTimes(myListOfVariables[0], myListOfVariables[1]); 
} 

else if (myListOfVariables.Length == 3) { 
    SayHelloXTimesForY(myListOfVariables[0], myListOfVariables[1], myListOfVariables[2]); 
} 

Однако это (очевидно) действительно неуклюжий код, и я хотел бы избежать этого любой ценой. Есть ли другое решение моей проблемы? Я знаю, что это действительно запутывает, но я сделал все возможное, чтобы объяснить это. Если вы все еще в замешательстве относительно того, что я пытаюсь сделать, сообщите мне.

И нет, это не проблема домашних заданий. ;)

+0

Почему бы вам просто не перечислить сам список? – BrokenGlass

+0

Я бы сделал это в одно мгновение, но не могу по причинам, которые потребуют от пяти до десяти абзацев объяснить. :) Короче говоря, я (пытаюсь) создать очень простой API для чего-то, и я не хочу ограничивать потенциальных пользователей использованием списков объектов для их параметров функции. –

+0

Я не уверен, что это такое, поэтому я пока не допущу этого. Мне придется искать IEnumerables, когда у меня будет время, и вернемся к вам. –

ответ

1

Я думаю, что вы хотите сделать можно сделать используя отражающий. Посмотрите на MethodBase.Invoke Method

Все, что вам нужно сделать, это добавить все параметры в том порядке, в котором функция ожидает массив объектов.

class Program 
    { 

     public static void SayHelloXTimes(string helloString, int x) 
     { 
      for (int i = 0; i < x; i++) 
      { 
       Console.WriteLine(helloString); 
      } 
     } 

     static void Main(string[] args) 
     { 
      MethodInfo Method = typeof(Program).GetMethod("SayHelloXTimes"); 
      Method.Invoke(null, new object[] { "foo", 3 }); 

      Console.ReadLine(); 
     } 
    } 
+0

Это выглядит многообещающим, я должен проверить его и посмотреть, подходит ли он для моей ситуации. Благодаря! –

+0

Как и почему вы используете 'var' в своем примере кода C#? Сразу после того, как оператор 'typeof' имеет какое-либо отношение к нему? –

+0

@ElliotBonneville var is MethodInfo .. отредактировал мой ответ –

0

Вы хотите params:

void SayHelloXTimes(params string[] list) { 
    for(int i = 0;i<list.Length;i++) { 
     print(list[i]) 
    } 
} 



SayHelloXTimes("Hi", "Hi", "Hi"); // legal 
SayHelloXTimes("Hi"); // legal 
SayHelloXTimes("Hi", "Hi", "Hi", "Hi", "Hi", "Hi"); // still legal 
+0

Посмотрите мой комментарий по первому вопросу и/или исправьте меня, если я что-то не понял. :) –

+0

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

+0

С ключевым словом params вы вызываете функцию с любым количеством строк, которые вы хотите. – Joe

0

Если бы это было мое заявление, я хотел бы создать класс параметров для хранения значений списка.

Вы можете передать список в конструктор класса и либо извлечь его в локальные свойства класса (поскольку вы знаете позиции), либо вы можете вывести значения как свойство readonly непосредственно из списка.

Затем вы можете просто передать экземпляр класса параметров для каждого из методов и не беспокоиться о количестве параметров для методов.

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