2010-01-29 8 views
5

J'ai une classe décorée avec un attribut ... [DataEntity("MESSAGE_STAGING", EnableCaching = true, CacheTimeout = 43200)]Comment définir les valeurs des attributs en utilisant la réflexion

pour une exigence, je veux changer cette valeur MESSAGE_STAGING au moment de l'exécution à Test_Message_Staging.

Quelle est la meilleure façon d'y parvenir? Puis-je utiliser la réflexion ou existe-t-il un autre moyen de le faire?

Veuillez fournir des exemples de code.

Merci SNA

+0

Quel est le problème sous-jacent est-ce que vous essayez de résoudre? –

Répondre

8

Je ne crois pas qu'il est possible de définir des attributs en utilisant la réflexion - et même si elle est, je vous encourage pas à le faire.

Les attributs doivent être utilisés pour les métadonnées connues à la compilation. Si vous voulez une forme plus dynamique de métadonnées, chargez-la à partir d'un fichier ou utilisez plutôt app.config ... ou ayez au moins des valeurs spéciales "espace réservé" (comme | DataDirectory | dans une chaîne de connexion) qui peuvent être résolues à l'exécution temps.

+0

l'exigence est que je hav de changer le nom de table d'une façon ou d'une autre.Attribute ne permettra pas de prendre des valeurs de web.config. Le paramètre devrait être une constante. donc la seule idée que je peux penser est d'obtenir l'attribut (dataEntity) de la classe de réflexion et de changer sa propriété. Mais est-ce possible – SNA

4

Il n'est pas possible de modifier la valeur de la propriété d'attribut lors de l'exécution avec la réflexion, car les attributs sont des méta-données sérialisées dans l'assemblage et leur modification implique la modification de l'assemblage.

+0

puis-je changer l'information de métadonnées par la réflexion? – SNA

+0

La réflexion est un mécanisme général disponible pour tous les types car sa fondation est établie dans la méthode GetType de la classe Object racine. Les informations qu'il renvoie pour un type ne sont pas extensibles, en ce sens qu'elles ne peuvent pas être modifiées après la compilation du type cible. –

1

Si je vous comprends bien, il y a un moyen possible dans la réflexion pour modifier la valeur d'attribut d'une instance lors de l'exécution .. extraira le code exemple

 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

Cela ne va pas persister dans l'objet instancié. –

Questions connexes