2010-01-29 20 views
5

Ho una classe decorato con un attributo ... [DataEntity("MESSAGE_STAGING", EnableCaching = true, CacheTimeout = 43200)]Come impostare i valori degli attributi utilizzando la riflessione

per qualche requisito, voglio cambiare questo valore MESSAGE_STAGING in fase di esecuzione per Test_Message_Staging.

Qual è il modo migliore per raggiungere questo obiettivo?

Posso usare il riflesso o esiste un altro modo per farlo.

Fornire esempi di codice.

Grazie SNA

+0

Che problema di fondo è che si sta cercando di risolvere? –

risposta

8

Non credo sia possibile impostare gli attributi utilizzando la riflessione - e anche se lo fosse, l'invitiamo a non farlo.

Gli attributi devono essere utilizzati per i metadati che sono noti al momento della compilazione. Se si desidera una forma più dinamica di metadati, caricarla da un file o utilizzare app.config invece ... o almeno avere alcuni valori speciali "segnaposto" (come | DataDirectory | in una stringa di connessione) che possono essere risolti all'esecuzione tempo.

+0

il requisito è che ho bisogno di cambiare il nome della tabella in qualche modo. Attributo non consentirà di prendere valori da web.config.Il parametro dovrebbe essere una costante. quindi l'unica idea a cui riesco a pensare è ottenere l'attributo (dataEntity) della classe dal riflesso e modificarne la proprietà. Ma è possibile – SNA

4

Non è possibile modificare il valore della proprietà dell'attributo in fase di esecuzione con la riflessione perché gli attributi sono metadati serializzati nell'assieme e modificarli significa modificare l'assembly.

+0

posso modificare le informazioni sui metadati tramite la riflessione? – SNA

+0

Reflection è un meccanismo generale disponibile per tutti i tipi poiché la sua fondazione è stabilita nel metodo GetType della classe Object radice. Le informazioni che restituisce per un tipo non sono estensibili, in quanto non possono essere modificate dopo la compilazione del tipo di destinazione. –

1

Se ho capito si correttamente, v'è un modo possibile di riflessione per cambiare il valore di attributo di un'istanza in fase di esecuzione .. checkout il codice di esempio

 AttributeCollection ac = TypeDescriptor.GetAttributes(yourObj); 

     foreach (var att in ac) 
     { 
      //DataEntityAttribute -- ur attribute class name 
      DataEntityAttribute da = att as DataEntityAttribute ; 
      Console.WriteLine(da.field1); //initially it shows MESSAGE_STAGING 
      da.field1= "Test_Message_Staging"; 
     } 


     //Check the changed value 
     AttributeCollection acc = TypeDescriptor.GetAttributes(yourObj); 

     foreach (var att in ac) 
     { 
      DataEntityAttribute da = att as DataEntityAttribute ; 
      Console.WriteLine(da.field1); //now it shows Test_Message_Staging 
     } 
+1

Questo non persisterà sull'oggetto istanziato. –

Problemi correlati