2010-01-29 15 views
5

Mam klasy ozdobione atrybut ... [DataEntity("MESSAGE_STAGING", EnableCaching = true, CacheTimeout = 43200)]Jak ustawić wartości atrybutów przy użyciu odbicia

jakiegoś wymogu, że chce zmienić tę wartość MESSAGE_STAGING w czasie wykonywania Test_Message_Staging.

Jaki jest najlepszy sposób, aby to osiągnąć?

Czy mogę użyć odbicia, czy jest jakiś inny sposób, aby to zrobić.

Proszę podać przykładowe kody.

Dzięki SNA

+0

Co Podstawowym problemem jest to, że starasz się rozwiązać? –

Odpowiedz

8

Nie wierzę, że to możliwe, aby ustawić atrybuty przy użyciu odbicia - a nawet jeśli jest, to zachęcam, aby nie zrobić.

Atrybuty powinny być używane dla metadanych znanych podczas kompilacji. Jeśli chcesz mieć bardziej dynamiczną formę metadanych, załaduj ją z pliku lub użyj app.config zamiast ... lub przynajmniej kilka specjalnych "zastępczych" wartości (takich jak | DataDirectory | w ciągu połączenia), które można rozwiązać przy wykonywaniu czas.

+0

Wymaganiem jest, aby zmienić nazwę tabeli w jakiś sposób.Atrybut nie zezwala na pobieranie wartości z web.config. Parametr powinien być stały. więc jedyną ideą, jaką mogę wymyślić jest uzyskanie atrybutu (dataEntity) klasy z odbicia i zmiana jego właściwości. Ale czy jest to możliwe – SNA

4

Nie można zmienić wartości właściwości atrybutu w czasie wykonywania z odbiciem, ponieważ atrybuty są metadanymi serializowanymi w złożeniu, a ich zmiana oznacza zmianę złożenia.

+0

czy mogę zmienić informacje o metadanych poprzez odbicie? – SNA

+0

Odbicie jest ogólnym mechanizmem dostępnym dla wszystkich typów, ponieważ jego podstawa została ustanowiona w metodzie GetType klasy obiektu głównego. Informacje, które zwraca dla danego typu, nie są rozszerzalne, ponieważ nie mogą być modyfikowane po kompilacji typu docelowego. –

1

Jeśli rozumiem zostanie poprawnie, nie jest możliwe w sposób refleksji, aby zmienić wartość atrybutu instancji w czasie wykonywania .. kasy przykładowy kod

 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

To nie będzie trwało w instancji obiektu. –

Powiązane problemy