Assegna valore al parametro metodo
-
14-11-2019 - |
Domanda
Immagina un metodo con la seguente firma:
public void ExampleMethod(string id, object data,
ref object A, ref object B, ref object C)
{
//...
}
.
Il valore in data
deve essere assegnato a A
, B
, C
o nulla, a seconda del valore di id
.In breve, se id == "A"
, quindi A = data;
Il problema è che il corpo di questo metodo è digitato da un essere umano ma la firma è generata in fase di esecuzione.A causa di ciò, non è possibile effettuare il codice fisso della logica perché è sconosciuto al momento della progettazione, quanti parametri di riferimento ci saranno e ciò che sono chiamati.Questo pezzo di codice può essere inserito in qualsiasi numero di metodi, ciascuno potenzialmente con una firma diversa, e deve funzionare in ognuno e ognuno.
So come ottenere tutti i parametri del metodo che uno è attualmente in, ma non riesco a capire come assegnare un valore a uno di questi parametri.Quello che sto cercando è qualcosa come il seguente:
public void ExampleMethod(string id, object data,
ref object A, ???????, ref object Z)
{
MethodBase method = MethodBase.GetCurrentMethod();
foreach (ParameterInfo parameter in method.GetParameters())
{
if (id == parameter.Name)
{
// Problem: assign data to parameter.
return;
}
}
}
. Soluzione
Non è possibile accedere ai parametri per nome, poiché non è possibile utilizzare la riflessione sulle variabili / parametri. Potresti avere alcune opzioni se questo era il, ma non proprio in c #. Il mio consiglio sarebbe: cambiare l'API, forse qualcosa che coinvolge un array o (forse migliore) un dizionario. Considera:
public void ExampleMethod(string id, object data,
IDictionary<string,object> args) {
args[id] = data;
}
.
Non sono sicuro se questo aiuta ... ma quello che stai cercando di fare non è davvero amichevole. L'altra opzione è quella di generare questo metodo dinamicamente, sia come parte del processo di costruzione, o tramite il. O dovrebbe andare bene. Quindi potrebbe essenzialmente generare (come c # o (in runtime) IL):
public void ExampleMethod(string id, object data,
ref object A, ref object B, ref object C)
{
switch(id) {
case "A": A = data; break;
case "B": B = data; break;
case "C": C = data; break;
default: /* do something */
}
}
.
Un approccio aggiuntivo: l'oggetto digitato: Dì che hai:
public void ExampleMethod(string id, object data, SomeType obj) {...}
.
dove obj
è un oggetto con proprietà come "A", "B", "c"; Allora quello che stai cercando di generare è:
switch(id) {
case "A": obj.A = data; break;
case "B": obj.B = data; break;
case "C": obj.C = data; break;
default: /* do something */
}
.
che può ovviamente essere fatto con la riflessione:
var prop = obj.GetType().GetProperty(id);
prop.SetValue(obj, data, null);
.
o se le prestazioni sono critiche, qualcosa come Fast-member :