2010-01-29 17 views
5

... [DataEntity("MESSAGE_STAGING", EnableCaching = true, CacheTimeout = 43200)]bazı gereksinimi için bir öznitelik süslenmiş bir sınıf var yansıması

kullanarak özellik değerlerini nasıl ayarlanır, ben Test_Message_Staging için çalışma zamanında bu değeri MESSAGE_STAGING değiştirmek istiyorum.

Bunu başarmanın en iyi yolu nedir?

Yansıma kullanabilir miyim, yoksa bunu yapmak için başka bir yol var mı?

Lütfen kod örnekleri verin.

Teşekkür SNA

+0

Eğer çalışıyorsanız o altta yatan nedir problem .. zamanında bir örneğinin nitelik değerini değiştirmek çıkış için yansımada olası bir yol var çözmek? –

cevap

8

Ben yansıma kullanarak özelliklerini ayarlamak mümkün olduğuna inanmıyorum - ve olsa bile, bunu yapmaya değil öneririm.

Derleme zamanında bilinen meta veriler için öznitelikler kullanılmalıdır. Daha dinamik bir meta veri formu istiyorsanız, onu bir dosyadan yükleyin veya bunun yerine app.config kullanın ... veya en azından yürütme sırasında çözülebilen bazı özel "yer tutucu" değerleri (bağlantı dizesinde | DataDirectory | gibi) var zaman.

+0

gereksinimi, tablo adını bir şekilde değiştirmek zorundayım.Attribute, web.config.The parametresinden değerlerin alınmasına izin vermeyecektir. Parametre sabit olmalıdır. Bu yüzden düşünebildiğim tek şey, sınıfın yansımasından (dataEntity) öznitelikten elde edilmesi ve mülkünü değiştirmesidir.Ama – SNA

4

Öznitelik özellik değerinin yansıtma ile çalışma zamanında değiştirilmesi mümkün değildir; çünkü öznitelikler, derleme içinde serileştirilmiş meta verilerdir ve bunları değiştirmek, aksamın değiştirilmesi anlamına gelir. i doğru anlamak

+0

metadata bilgisini yansıma yoluyla değiştirebilirmiyim? – SNA

+0

Yansıma, temel nesnesi, kök Nesne sınıfının GetType yönteminde oluşturulduğundan, tüm türlerde kullanılabilen genel bir mekanizmadır. Bir tür için döndürdüğü bilgiler, hedef türün derlenmesinden sonra değiştirilememesi nedeniyle genişletilemez. –

1

, örnek kodlar

 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

Bu, örneklenen nesneye kalıcı olmaz. –