2011-03-09 23 views
6

मैं ऑटो-जनरेटिंग कोड हूं जो विन्यास (टेक्स्टबॉक्स, डेटटाइमपिकर्स इत्यादि) के आधार पर एक विनफॉर्म संवाद बनाता है। इन संवादों पर नियंत्रण सहेजे गए डेटासेट से पॉप्युलेट किए जाते हैं औररनटाइम पर, मैं कैसे जांच सकता हूं कि कोई संपत्ति केवल पढ़ी गई है या नहीं?

को विभिन्न नियंत्रण वस्तुओं (कस्टम या अन्य) के लिए सेट सेट और गुण प्राप्त करने की आवश्यकता होती है।

//Upon opening of form - populate control properties with saved values 
MyObject.Value = DataSource.GetValue("Value"); 

//Upon closing of form, save values of control properties to dataset. 
DataSource.SetValue("Value") = MyObject.Value; 

अब यह ठीक है, लेकिन केवल पढ़ने के लिए क्या गुण हैं? मैं संपत्ति के नतीजे को सहेजना चाहता हूं लेकिन यह जानने की जरूरत है कि कोड उत्पन्न नहीं करना है जो इसे पॉप्युलेट करने का प्रयास करेगा।

//Open form, attempt to populate control properties. 
//Code that will result in 'cannot be assigned to -- it is read only' 
MyObject.HasValue = DataSource.GetValue("HasValue"); 
MyObject.DerivedValue = DataSource.GetValue("Total_SC2_1v1_Wins"); 

//Closing of form, save values. 
DataSource.SetValue("HasValue") = MyObject.HasValue; 

याद रखें कि मुझे उस वस्तु के प्रकार को नहीं पता है जिसे मैंने रनटाइम तक तुरंत चालू किया है।

मैं (रनटाइम पर) एक पठनीय संपत्ति की पहचान कैसे कर सकता हूं?

+0

मेरी राय में, उपयोगकर्ता आपके यूआई फॉर्म से एक संपत्ति को संशोधित नहीं कर सकते हैं यदि यह पढ़ा गया हो। ऐसा लगता है कि वर्तमान में सभी गुणों को फ़ॉर्म पर संपादित करने की अनुमति है, और आप उन्हें सहेजते समय जांचते हैं? –

+0

आपके कथन में सत्य, लेकिन यह स्वतः उत्पन्न कोड है। त्रुटि संकलन समय पर है। एकमात्र समय जब मुझे "असाइन नहीं किया जा सकता" तब होगा जब कोड उत्पन्न होता है, जो नियंत्रण से संबंधित गुणों को पॉप्युलेट कर रहा है, इस प्रकार गलती से एक संरक्षित संपत्ति को सहेजे गए गुण को असाइन कर रहा है। – MoSlo

उत्तर

5

PropertyDescriptor के साथ, IsReadOnly देखें।

PropertyInfo के साथ, CanWrite (और CanRead, उस मामले के लिए) की जांच करें।

तुम भी PropertyInfo के मामले में [ReadOnly(true)] जाँच करना चाहते हो सकता है (लेकिन यह पहले से ही PropertyDescriptor साथ नियंत्रित किया जाता है):

ReadOnlyAttribute attrib = Attribute.GetCustomAttribute(prop, 
     typeof(ReadOnlyAttribute)) as ReadOnlyAttribute; 
bool ro = !prop.CanWrite || (attrib != null && attrib.IsReadOnly); 

IMO, PropertyDescriptor यहाँ उपयोग करने के लिए एक बेहतर मॉडल है, यह कस्टम मॉडल की अनुमति देगा।

1

इसके अलावा - See Microsoft Page

using System.ComponentModel; 

// Get the attributes for the property. 

AttributeCollection attributes = 
    TypeDescriptor.GetProperties(this)["MyProperty"].Attributes; 

// Check to see whether the value of the ReadOnlyAttribute is Yes. 
if(attributes[typeof(ReadOnlyAttribute)].Equals(ReadOnlyAttribute.Yes)) { 
    // Insert code here. 
} 
2

मैंने देखा है कि जब PropertyInfo का उपयोग कर, CanWrite संपत्ति सही है भले ही सेटर निजी है। यह सरल चेक मेरे लिए काम करती है:

bool IsReadOnly = prop.SetMethod == null || !prop.SetMethod.IsPublic; 
संबंधित मुद्दे

 संबंधित मुद्दे