2010-01-29 18 views
5

tengo una clase adornada con un atributo ... [DataEntity("MESSAGE_STAGING", EnableCaching = true, CacheTimeout = 43200)]Cómo establecer valores de atributos utilizando la reflexión

por algún requisito, que quieren cambiar este valor MESSAGE_STAGING en tiempo de ejecución a Test_Message_Staging.

¿Cuál es la mejor manera de lograrlo?

¿Puedo utilizar la reflexión, o hay alguna otra manera de hacerlo?

Indique los ejemplos del código.

Gracias SNA

+0

¿Qué problema subyacente es que usted está tratando de ¿resolver? –

Respuesta

8

no creo que es posible establecer atributos usando la reflexión - e incluso si lo es, me animo a no hacerlo.

Los atributos se deben usar para los metadatos que se conocen en tiempo de compilación. Si desea una forma más dinámica de metadatos, cárguelo de un archivo o use app.config en su lugar ... o al menos tenga algunos valores especiales de "marcador de posición" (como | DataDirectory | en una cadena de conexión) que se pueden resolver en la ejecución hora.

+0

el requisito es que tengo que cambiar el nombre de la tabla de alguna manera. La contribución no permitirá tomar valores de web.config. El parámetro debe ser una constante. así que la única idea que puedo pensar es obtener el atributo (dataEntity) de la clase desde la reflexión y cambiar su propiedad. Pero ¿es posible – SNA

4

No es posible cambiar el valor de propiedad de atributo en tiempo de ejecución con reflexión porque los atributos son meta-datos serializados en el ensamblado y cambiarlos significa cambiar el ensamblaje.

+0

puedo cambiar la información de metadatos a través de la reflexión? – SNA

+0

La reflexión es un mecanismo general disponible para todos los tipos porque su base se establece en el método GetType de la clase de objeto raíz. La información que devuelve para un tipo no es extensible, ya que no se puede modificar después de la compilación del tipo de destino. –

1

Si he entendido bien, hay una forma posible en la reflexión para cambiar el valor del atributo de una instancia en tiempo de ejecución .. descargar el código de ejemplo

 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

Esto no persistirá en el objeto instanciado. –

Cuestiones relacionadas