2013-08-12 12 views
9

Considerate questo codice:ImpostaValore nella riflessione in C#

var future = new Future(); 
future.GetType().GetProperty(info.Name).SetValue(future, converted); 

Nel codice di cui sopra dovrebbe passare due argomenti per SetValue. In primo luogo, l'oggetto che vogliamo impostare la sua proprietà. In secondo luogo, il nuovo valore. Ma selezioniamo la proprietà specifica.

Perché dovremmo passare il primo parametro per impostare il valore come abbiamo impostato l'oggetto futuro prima !?

+2

riflessione sarebbe (più) terribilmente complesso se ogni oggetto doveva ricordare * come * è stato ottenuto, solo in modo che si potrebbe utilizzare quello registrato informazioni in seguito, piuttosto che chiedere di nuovo tramite un parametro. Cioè ci sono molti modi per ottenere un 'Type', non tutti richiedono prima un'istanza di quel tipo. –

risposta

18

Poiché l'oggetto futuro è un'istanza. La proprietà PropertyInfo viene recuperata dal tipo (Type type = future.GetType();) e non è associata a nessuna istanza. Ecco perché devi passare l'istanza nello SetValue().

Quindi:

var future = new Future(); 

var propertyName = "..."; 
Type type = future.GetType(); 
PropertyInfo propertyInfo = type.GetProperty(propertyName); 

propertyInfo.SetValue(future, value); 

è possibile riutilizzare il PropertyInfo per impostare le proprietà di altre istanze.

4

non è stato impostato l'oggetto futuro prima - hai semplicemente estratto il suo tipo, e quindi funzionamento con questo. Ciò che si ottiene è un oggetto PropertyInfo che fa riferimento a tale proprietà su qualsiasi istanza di tipo Future.

5

Qui

future.GetType() 

future è stato utilizzato solo per ottenere il suo tipo. Effettivamente è la stessa di

Type t = future.GetType(); 
t.GetProperty(info.Name).SetValue(future, converted); 

Sulla seconda riga del codice di cui sopra tutte le conoscenze su ciò che oggetto è stato utilizzato per ottenere il tipo è perso, e abbiamo a che fare con il tipo stesso. Più tardi, quando abbiamo informazioni sulla proprietà del tipo, abbiamo bisogno di sapere con quale oggetto dovrebbe essere usato, quindi stiamo fornendo ancora future.

1

Si potrebbe facilmente fare seguente:

typeof(Future).GetProperty(info.Name).SetValue(future, converted); 

Come potrebbe l'istanza essere prese senza future parametro?

1

Considerare questi 2 classi:

class Future 
{ 
    public int MyProperty { get; set; } 
} 
class FarFuture : Future { } 

Date un'occhiata a questo codice:

var future = new Future(); 
var farFuture = new FarFuture(); 
future.GetType().GetProperty(info.Name).SetValue(farFuture, converted); 

Il PropertyInfo non è vincolata a un'istanza, ma a un tipo.

Problemi correlati