2010-08-01 18 views
5

rozumiem, jak uzyskać nazwy parametrów przekazywanych do metody, ale powiedzmy, że mam deklarację metody następująco:Jak przekazać zmienną liczbę nazwanych parametrów do metody?

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

i chcę użyć nazwy obiektu/nieruchomości w moim szablon do zastąpienia z rzeczywistym wartości właściwości w dowolnym obiekcie w moim parametrze `objects '. Załóżmy następnie powiedzieć, że wywołanie tej metody z:

ParamsTest("Congrats", customer, purchase); 

ja będę tylko w stanie odzyskać dwie nazwy parametrów próbuje wypełnić szablon, mianowicie, template i objects oraz nazwy obiektów w kolekcji objects są na zawsze zagubione, czy nie?

Mogę wymagać List<object> jako mojego drugiego parametru, ale czuję, że jest w jakiś sposób bardziej eleganckie rozwiązanie, może z lambda lub coś takiego. Nie wiem, nie jestem przyzwyczajony do używania lambdów poza LINQ.

+1

Co o 'Słownik ', gdzie ciąg jest nazwą zmiennej? – Oded

+0

+1. może w jakiś sposób używać rzeczywistych nazwanych C# 4? 'ParamTest (klient: klient, zakup: zakup)' – mpen

+0

Sniff :-(Nie mogę używać C# 4. – ProfK

Odpowiedz

5

Inpsired przez Marka mogę zaoferować anonimowy typ odpowiedź:

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); 
     } 
    } 
} 

Jednak ma to wady:

  • Brak bezpieczeństwa typu. mogę przejść w dowolnym obiekcie
  • mogę przechodzić w anonimowej typu z różnych członków i/lub typów niż oczekiwano
  • Należy również zrobić więcej kontroli niż w tej krótkiej próbie
+0

Możesz także zmienić parametry w wywołaniu :) –

+1

+1 dla mnie, lol. – mpen

+0

Chciałbym też móc głosować Markowi, ale jego odpowiedź nie jest. Dzięki, to moja wybrana trasa. – ProfK

0

można zdefiniować parametry obiektu:

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

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

zmienić podpis metody:

ParamsTest(ParamsTestParams parameters) 

i skontaktować się metodą tak:

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

czyli

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

czyli

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

czyli

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

i tak dalej.

+1

może używać anonimowego obiektu zamiast tego w C# 4 – mpen

+0

tak, ale uzyskanie jego członków i ich nazw wewnątrz ParamsTest nie jest prostym zadaniem - wymaga ono odbicia –

+0

Dodany przykład anonimowego przykładu –

0

to pewnie po prostu zrób to tak:

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

i nazwać tak:

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

Tak jak w moim anonimowym typie, nie masz naprawdę bezpieczeństwa typu, nie masz też nazewnictwa parametrów. Można także skrócić składnię od "nowego obiektu [] {...}" do "nowego [] {...}" –

+0

Naprawdę potrzebuję nazewnictwa parametrów. – ProfK

+0

Wtedy myślę, że sugestia Odeda dla Słownika jest twoją najłatwiejszą opcją – snurre

Powiązane problemy