2011-11-30 15 views
11

मैं 'त्रुटियों' की एक धारणा है करने के लिए किसी भी प्रकार केएक वर्ग के प्रत्येक संपत्ति के लिए अतिरिक्त गुण जोड़ना

public class Test 
{ 
public string A {get;set;} 
public object B {get;set;} 
public int C {get;set;} 
public CustomClass D {get;set;} 
} 

मैं इस वर्ग के भीतर वस्तुओं के सभी चाहते हैं के गुणों के किसी भी संख्या के साथ एक वर्ग है और कहो 'चेतावनी'। उदाहरण के लिए, किसी अन्य वर्ग में कुछ शर्त के आधार पर, मैं संपत्ति ए पर एक चेतावनी सेट करना चाहूंगा, और उसके बाद उस जानकारी को जीयूआई में प्रदर्शित कर सकता हूं। जीयूआई मेरी चिंता नहीं है; बल्कि मुझे यह चेतावनी कैसे सेट करनी चाहिए? मैं की तरह कुछ करने के लिए सक्षम होने के लिए प्यार होता है:

एक कक्षा में हर संपत्ति के लिए, एक 'चेतावनी' और 'त्रुटि' प्रॉपर्टी जोड़ने के इस तरह मैं ऐसा कर सकते हैं ..

Test t = new Test(); 
t.A.Warning = "This is a warning that the GUI will know to display in yellow". 
t.B.Error = null; 

क्या सबसे अच्छा है ऐसा करने के लिए जाने का तरीका? यह अच्छा होगा अगर मैं कक्षा की प्रत्येक संपत्ति में एक कस्टम विशेषता जोड़ सकता हूं जो इन अतिरिक्त गुणों को जोड़ देगा और मुझे स्पष्ट तरीके से उन तक पहुंचने की अनुमति देगा।

मैंने ऐसे समाधान देखे हैं जो अभिभावक वर्ग (टेस्ट) में एक शब्दकोश जोड़ते हैं, और उसके बाद संपत्ति नामों से मेल खाने वाले तारों में गुजरते हैं, या संपत्ति का नाम प्राप्त करने के लिए प्रतिबिंब का उपयोग करते हैं और इसमें प्रवेश करते हैं, लेकिन मैं कुछ क्लीनर पसंद करूंगा ।

उत्तर

8

आप एक कस्टम विशेषता जोड़ सकता है कि आप संपत्ति चाहते हैं और फिर उन विशेषताओं तक पहुंचने के लिए ऑब्जेक्ट पर एक्सटेंशन विधि का उपयोग करें।

इस तरह कुछ काम करना चाहिए

पहले तुम तो इसे उपयोग अपनी विशेषता वर्ग

[AttributeUsage(AttributeTargets.All/*, AllowMultiple = true*/)] 
public class WarningAttribute : System.attribute 
{ 
    public readonly string Warning; 

    public WarningAttribute(string warning) 
    { 
     this.Warning = warning; 
    }  
} 

अधिक पढ़ना Here

रूप में इस तरह

[WarningAttribute("Warning String")] 
public string A {get;set;} 

इसका इस्तेमाल बनाने की आवश्यकता होगी जैसे MSDN Article

public static string Warning(this Object object) 
{ 
    System.Attribute[] attrs = System.Attribute.GetCustomAttributes(object); 

    foreach (System.Attribute attr in attrs) 
     { 
      if (attr is WarningAttrbiute) 
      { 
       return (WarningAttribute)attr.Warning; 
      } 
     } 
} 

तो फिर तुम एक आइटम है कि आप आप पर चेतावनी उपयोग करना चाहते बस

test.A.Warning; 

कॉल कर सकते हैं अगर आप चेतावनी स्ट्रिंग सेट के लिए इच्छुक रहे हैं तो आप के लिए सेटर के कुछ प्रकार लागू कर सकता है कि थोड़ा और साफ है। संभावित रूप से द्वितीयक वस्तु या संपत्ति प्रकार को सेट करने के माध्यम से।


करने के लिए इस के बजाय सिर्फ string और का उपयोग करने का होगा एक वैकल्पिक पद्धति object आप एक कस्टम सामान्य प्रकार है कि संपत्ति की स्थापना को संभालने के लिए बना सकते हैं।

कुछ की तरह

public class ValidationType<T> 
{ 
    public T Value {get; set;} 
    public string Warning {get; set;} 
    public string Error {get; set;} 

    public ValidationType(T value) 
    { 
     Value = value; 
    } 
} 

तरह
var newWarning = new ValidationType<string>("Test Type"); 
newWarning.Warning = "Test STring"; 
Console.WriteLine("newWarning.Value"); 

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। मुझे लगता है कि मैं इसे लागू करूंगा। मुझे वास्तव में स्ट्रिंग गुणों तक पहुंचने के लिए newWarning.Value का उपयोग करने से प्यार नहीं है, लेकिन ऐसा लगता है कि मुझे कहीं कुछ सुविधा बलिदान करना होगा। – user981225

1

सबसे पहले, विशेषताएँ उनके द्वारा रखे गए ऑब्जेक्ट को संशोधित नहीं कर सकती हैं। जब तक आप उन्हें एओपी के साथ जोड़ते हैं। मैं इसे विरासत में कक्षा के चारों ओर एक रैपर वर्ग का उपयोग करने का सुझाव दूंगा, बशर्ते कक्षाएं मुहरबंद न हों। अगर उन्हें सील कर दिया गया है, तो आपको अपने रैपिंग क्लास का एक उदाहरण है जो एक निजी क्षेत्र में जोड़ने के अलावा, सभी परिचालनों को छोड़कर, एक वास्तविक रैपर वर्ग लिखना होगा।

संपादित करें: उपयोग की आसानी के लिए, सुझाव दिया गया विस्तार विधि अपहरण शायद सबसे अच्छा समाधान है।

2

यदि आप संपत्ति के बजाय एक विधि से दूर हो सकते हैं, तो आप ऑब्जेक्ट के लिए एक्सटेंशन बना सकते हैं - लेकिन फिर कुछ वर्गों के लिए इसका उपयोग सीमित करना मुश्किल होगा।

कुछ की तरह:

public static void Warning(this object target, string message) 
{ 
... 
} 

public static String GetWarning(this object target) 
{ 
} 

बेशक यह वस्तु की राज्य में इस तरह के एक चेतावनी बनाए रखने के लिए मुश्किल होगा, लेकिन तब आप कुछ शब्दकोशों इस्तेमाल कर सकते हैं, आदि

+0

आपकी पोस्ट के लिए धन्यवाद लेकिन मैं इस समाधान से बचना पसंद करूंगा। मैं वास्तविक संपत्ति को यह जानना चाहता हूं कि इसमें कोई त्रुटि है या नहीं, पैरेंट ऑब्जेक्ट को तारों के शब्दकोश के माध्यम से लूप करना है (उदाहरण के लिए)। – user981225

2

उपयोग बल्कि गुण विशेषता की कोशिश कर रहा से, मैं एक आधार वर्ग के लिए त्रुटि/चेतावनी गुण का एक संग्रह को जोड़ने सुझाव देंगे कि आपके व्यापार वस्तुओं से प्राप्त होता है।

इस तरह, आप अधिक विस्तृत जानकारी प्रदान कर सकते हैं, जब आप उपयोगकर्ता को प्रदर्शित किए जाते हैं तो आप उन्हें हटा सकते हैं, और यदि आप "तार" (वेब ​​सेवाओं, डब्ल्यूसीएफ सेवाओं) पर अपना डेटा भेज रहे हैं, तो विशेषताओं को भेजने के लिए विशेष प्रसंस्करण की आवश्यकता के बजाय त्रुटियां आपकी ऑब्जेक्ट्स के साथ यात्रा कर सकती हैं।

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