2010-08-01 3 views
5

Я понимаю, как получить имена параметров, передаваемых в метод, но, скажем, у меня есть объявление метода следующим образом:Как передать переменное число именованных параметров в метод?

static void ParamsTest(string template, params object[] objects) 

, и я хочу использовать имена объектов/свойств в шаблоне для замены с реальным значения свойств в любом из объектов в моем параметре «objects». Давайте тогда говорить, что я называю этот метод с:

ParamsTest("Congrats", customer, purchase); 

я буду только иметь возможность получить два имени параметра пытается заполнить шаблон, а именно, template и objects, а имена объектов в objects коллекции навсегда потеряны или нет?

В качестве второго параметра мне может потребоваться List<object>, но я чувствую, что есть более элегантное решение, возможно, с лямбдой или чем-то еще. Я не знаю, я не привык использовать lambdas вне LINQ.

+1

насчет 'Словаря ', где строка - это имя переменной? – Oded

+0

+1. может каким-то образом использовать реальные имена C# 4? 'ParamTest (клиент: клиент, покупка: покупка)' – mpen

+0

Sniff :-(Я не могу использовать C# 4. – ProfK

ответ

5

непрестанно воодушевляля Марком я могу предложить анонимный тип ответа:

using System; 

namespace ConsoleApplication5 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      ParamsTest(new { A = "a", B = "b"}); 
     } 

     public static void ParamsTest(object o) 
     { 
      if (o == null) 
      { 
       throw new ArgumentNullException(); 
      } 
      var t = o.GetType(); 
      var aValue = t.GetProperty("A").GetValue(o, null); 
      var bValue = t.GetProperty("B").GetValue(o, null); 
     } 
    } 
} 

Однако эти недостатки имеют следующие недостатки:

  • Нет безопасности. Я могу передать в любом объекте
  • я могу передать в анонимном типе с различными членами и/или типами, чем те ожидало
  • Вы также должны сделать больше проверок, чем в этом коротком образце
+0

Вы также можете изменить порядок в вызове :) –

+1

+1 для меня, lol. – mpen

+0

Мне жаль, что я не проголосовал. Отметьте также, но это не ответ. Спасибо, это мой выбранный маршрут. – ProfK

0

Вы можете определить параметры объекта:

public class ParamsTestParams { 
    public string A { get; set; } 
    public string B { get; set; } 

    public static readonly ParamsTestParams Empty = new ParamsTestParams(); 
} 

Изменить методы подпись:

ParamsTest(ParamsTestParams parameters) 

И позвони ваш метод следующим образом:

ParamsTest(new ParamsTestParams { A = "abc" }); 

или:

ParamsTest(new ParamsTestParams { B = "abc" }); 

или:

ParamsTest(new ParamsTestParams { A = "abc", B = "xyz" }); 

или:

ParamsTest(ParamsTestParams.Empty); // instead of null so you don't have to do null checks in the method's body 

и так далее.

+1

может использовать анонимный объект вместо C# 4 – mpen

+0

да, но получение его членов и их имен внутри ParamsTest - непростая задача - это включает отражение –

+0

Добавлен анонимный пример типа –

0

я бы, вероятно, просто сделать это следующим образом:

static void ParamsTest(string template, object[] objects) 

и назвать его так:

ParamsTest("Congrats", new object[] { customer, purchase }); 
+0

Как и в моем анонимном образце типа, у вас действительно нет безопасности типа, также у вас нет именования параметров. Кроме того, вы можете быть короче в синтаксисе от «new object [] {...}" до "new [] {...}" –

+0

Мне действительно нужно называть параметры. – ProfK

+0

Тогда я думаю, что предложение Одеда словаря - ваш самый простой вариант. – snurre

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