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

È stato utile?

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 :

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top