2009-05-07 11 views
6

Mi chiedo come posso recuperare gli argomenti in ingresso del mio metodo in un array. O semplicemente recupera i valori dei miei argomenti dinamicamente.Cattura i valori degli argomenti in ingresso nell'array KeyValuePair

significato, una chiamata del tipo:

MyMethod(10, "eleven"); 

Per il metodo:

void MyMethod(int Test, str Test2) {} 

risolverebbe in un array come:

{{"Test" => 10}, {"Test2", "eleven"}} 

sarebbe ancora meglio se avessi potuto raggiungere questo obiettivo con la riflessione .. Es. in qualche modo con StackTrace.

+0

Sì. Non li avrai. Otterrai solo i nomi dei parametri. Quindi penso che non funzionerà. – Kirtan

+0

@Robin: hai visto la mia implementazione per aggiungere facilmente argomenti a un dizionario? Ho modificato la mia risposta. È stato utile? –

risposta

2

L'opzione migliore è farlo con un tipo anonimo, come mostrato in this example.

3

Penso che quello che stai cercando non esiste. Il più vicino si può avere è params:

MyMethod(params object[] args) 
{ 
    // if you have to do this, it's quite bad: 
    int intArg = (int)args[0]; 
    string stringArg = (string)arg[1]: 
} 

// call with any number (and type) of argument 
MyMethod(7, "tr"); 

Non v'è alcun controllo di tipo tempo di compilazione, e quindi non è un modo per tutti gli usi per gestire argomenti. Ma se i tuoi argomenti sono dinamici, è probabilmente una soluzione.


Edit: ha avuto un'altra idea:

Hai bisogno di mettere manualmente ogni discussione in un elenco/dizionario. È possibile scrivere una classe di supporto per consentire il seguente:

MyMethod(int arg1, string arg2) 
{ 
    Arguments.Add(() => arg1); 
    Arguments.Add(() => arg2); 
    // 
} 

L'aiutante si presenta così

public static void Add<T>(Expression<Func<T>> expr) 
{ 
    // run the expression to get the argument value 
    object value = expr.Compile()(); 
    // get the argument name from the expression 
    string argumentName = ((MemberExpression)expr.Body).Member.Name; 

    // add it to some list: 
    argumentsDic.Add(argumentName, value); 
} 
+0

Il fatto è che sto usando WebServices. Voglio catturare gli argomenti in arrivo della chiamata effettuata ... –

+0

Ho avuto un'altra idea ... vedi la nuova sezione nella mia risposta. –

0

Nizza Domanda (+1). Credo che questo sia ciò che è necessario -

MethodBase mb = MethodBase.GetCurrentMethod(); 
ParameterInfo[] pi = mb.GetParameters(); 
+0

Ma non otterrai i valori dell'argomento, vero? –

+1

L'ho già provato. Ma ottengo solo i nomi degli argomenti, non i valori della chiamata in arrivo/corrente. –

+0

Stefan: Esattamente .. –

0

Un modo che conosco (non so se è l'unico modo al giorno d'oggi, ma è usato per essere) è quello di utilizzare orientata agli aspetti di programmazione (AOP), in particolare intercettazione. È un po 'doloroso arrotolarlo a mano, ma ci sono strumenti eccellenti che vengono in soccorso. Uno di questi strumenti è PostSharp: http://www.postsharp.org/.

0

Poiché il metodo utilizza parametri denominati, perché non è possibile popolare in modo esplicito un dizionario con i relativi nomi e valori? Non ha molto senso usare la riflessione per ottenere i loro nomi poiché li conosci già.

Come già detto, la parola chiave params può essere utilizzata per definire un metodo con un numero variabile di parametri, ma per definizione quelli sono senza nome.

Non sono sicuro che quello che chiedi, nel modo in cui l'hai spiegato, abbia senso. Forse potresti approfondire ulteriormente?

0

Forse questo non sarà esattamente quello che stavi cercando, ma ho scoperto che avrei potuto ottenere un ragionevole compromesso per la mia situazione usando una variazione del metodo suggerita da Matt Hamilton e facendo uso della denominazione implicita dei parametri di tipo anonimo:

public void MyMethod(string arg1, bool arg2, int arg3, int arg4) 
{ 
    var dictionary = new PropertyDictionary(new 
    { 
     arg1, arg2, arg3, arg4 
    }); 
} 

public class PropertyDictionary : Dictionary<string, object> 
{ 
    public PropertyDictionary(object values) 
    { 
     if(values == null) 
      return; 

     foreach(PropertyDescriptor property in TypeDescriptor.GetProperties(values)) 
      Add(property.Name, property.GetValue(values); 
    } 
}  

come ho detto, non può essere utili per l'utente, ma in miniera (unità di testare un metodo che elabora XML) è stato molto utile.

Problemi correlati