2012-04-06 10 views
11

पर कस्टम विशेषता का पैरामीटर बदलें मुझे रनटाइम के दौरान परिवर्तन विशेषता के पैरामीटर की आवश्यकता है। मैंने सरल समस्या के लिए अपनी समस्या को सरल बना दिया।रनटाइम

गुण वर्ग:

[AttributeUsage(AttributeTargets.Property)] 
    public class MyAttribute : Attribute 
    { 
     public string Name { get; set; } 
    } 

सरल इकाई है जो विशेषताओं के साथ गुण से सजाया गया है:

public class MyEntity 
    { 
     [MyAttribute(Name="OldValue1")] 
     public string Data1{ get; set; } 

     [MyAttribute(Name = "OldValue2")] 
     public string Data2 { get; set; } 
    } 

मैं कक्षा MyEntity की instace बनाया। मैं ऑब्जेक्ट की गुणों का मान बदल सकता हूं, लेकिन मैं ऑब्जेक्ट इकाई पर विशेषता गुण की संपत्ति का मूल्य नहीं बदल सकता। क्या यह संभव है? वस्तु इकाई पर संपत्ति का

मूल्य मैं कोड के इस हिस्से के साथ बदल सकते हैं:

   entityProp.SetValue(entity,"NewData",null); 

लेकिन मैं की विशेषता की संपत्ति नाम कैसे बदल मूल्य वस्तु इकाई

पर नहीं है यह काम नहीं:

प्रॉपर्टी नाम के
attProp.SetValue(attribute,"NewData",null); 

मूल्य अभी भी मूल है।

यहां सभी परीक्षण कोड हैं। नरक के लिए धन्यवाद।

[TestMethod] 
    public void Test() 
    { 
     var entity = new MyEntity 
         { 
          Data1 = "OldData", 
          Data2 = "OldData" 
         }; 

     PropertyInfo[] entityProps = entity.GetType().GetProperties(); 

     foreach (var entityProp in entityProps) 
     { 
      var attribute = Attribute.GetCustomAttribute(entityProp, typeof (MyAttribute)) as MyAttribute; 

      if (attribute != null) 
      { 
       //get attribute’s property NAME 
       PropertyInfo attProp= attribute.GetType().GetProperty("Name"); 

       //get entity property value 
       var propertyValue = entityProp.GetValue(entity, null); 

       //get attribute’s property NAME value 
       var atributeNameValue = attProp.GetValue(entity, null); 

       TestContext.WriteLine(string.Format("property name:{0} property value: {1} : atribute name value: {2}\n", 
        entityProp.Name, propertyValue, atributeNameValue)); 

       //change values 
       entityProp.SetValue(entity,"NewData",null); 

       //how can I change value of property Name on object entity ? 
       attProp.SetValue(attribute,"NewData",null); 

      } 

     } 

     TestContext.WriteLine(string.Format("After change\n")); 

     foreach (var entityProp in entityProps) 
     { 
      var attribute = Attribute.GetCustomAttribute(entityProp, typeof(MyAttribute)) as MyAttribute; 

      if (attribute != null) 
      { 

       PropertyInfo attProp = attribute.GetType().GetProperty("Name"); 

       var propertyValue = entityProp.GetValue(entity, null); 
       var atributeNameValue = attProp.GetValue(entity, null); 

       TestContext.WriteLine(string.Format("property name:{0} property value: {1} : atribute name value: {2}\n", 
        entityProp.Name, propertyValue, atributeNameValue)); 
      } 
     } 



    } 

संपादित: मैं मूल पोस्ट हटा सकते हैं और बहुत ही सरल स्पष्ट नमूना गयी। क्षमा करें

+0

साइड नोट: आपकी दूसरी विधि क्यों पकड़ रही है और फिर अपवाद फेंक रही है? –

उत्तर

10

आप रनटाइम पर विशेषताओं को नहीं बदल सकते हैं। वे असेंबली के मेटाडेटा में एम्बेडेड हैं। आपकी विधि किसी विशेष घटना की आंतरिक स्थिति को बदल रही है; लेकिन जब आप फिर से विशेषता लोड करते हैं, तो आपको एक अलग उदाहरण मिल रहा है।

+0

@ माइक मैंने रनटाइम पर विशेषताओं को बदलने के लिए समाधान खोजने में बहुत प्रयास किए। यहां तक ​​कि मेरे 1337 हैक्सक्सर कौशल के साथ, मुझे कुछ भी नहीं मिला। आपको यह जवाब पसंद नहीं हो सकता है, लेकिन दुर्भाग्यवश यह सही है। – payo

+0

आप सही हैं कि मैंने पूरे दिन बिताया लेकिन समाधान नहीं मिला क्योंकि इस समस्या में समाधान नहीं है। :(तो क्षेत्र को केवल पढ़ने योग्य गुण? – Mike

3

प्रतिबिंब के साथ यह संभव नहीं है, जैसा कि पहले से ही उल्लेख किया गया है (मेटाडाटा तय है)। हालांकि, यह टाइपडिस्क्रिप्टर के साथ आंशिक रूप से संभव है, जो रनटाइम पर विशेषताओं को जोड़ने और बदलने की अनुमति देता है, और पूर्ण वैकल्पिक मॉडल (TypeDescriptionProvider, आदि) प्रदान करता है। इस दृष्टिकोण को प्रतिबिंब का उपयोग करने वाले किसी भी कोड द्वारा सम्मानित नहीं किया जाएगा, लेकिन TypeDescriptor (आमतौर पर, डेटा बाध्यकारी और अन्य यूआई कोड) का उपयोग कर कोई भी कोड परिवर्तनों को नोटिस करेगा।

नोट टाइप डिस्क्रिप्टर केवल प्रत्येक विशेषता-प्रकार प्रति टाइप/सदस्य के साथ काम करता है; बहु-आवृत्ति गुण अच्छी तरह से समर्थित नहीं हैं।