2010-10-26 10 views
30

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

 
Property 1: Value of property 1\n 
Property 2: Value of property 2\n 
... 

वहाँ यह करने के लिए एक रास्ता है:

मैं एक ToString ओवरराइड कि की तर्ज पर कुछ रिटर्न जोड़ना चाहते हैं?

+0

मैं मतदान से राज्य के एक अधिक विस्तृत आत्मनिरीक्षण से प्रेरणा ले जा सकते हैं डुप्ली के रूप में बंद करने के लिए, लेकिन एक विलय भी उचित प्रतीत होता है। – mafu

उत्तर

59

मुझे लगता है कि तुम यहाँ एक छोटे से प्रतिबिंब का उपयोग कर सकते हैं। Type.GetProperties() पर एक नज़र डालें।

private PropertyInfo[] _PropertyInfos = null; 

public override string ToString() 
{ 
    if(_PropertyInfos == null) 
     _PropertyInfos = this.GetType().GetProperties(); 

    var sb = new StringBuilder(); 

    foreach (var info in _PropertyInfos) 
    { 
     var value = info.GetValue(this, null) ?? "(null)"; 
     sb.AppendLine(info.Name + ": " + value.ToString()); 
    } 

    return sb.ToString(); 
} 
+3

+1 अच्छा जवाब का उपयोग करें। एक मामूली दोष है। _PropertyInfos हमेशा शून्य है, यह '_PropertyInfos = this.GetType()। GetProperties();' if में होना चाहिए। –

+0

@ कॉनराड-फ्रैक्स: हाँ, आप सही हैं। इसे ठीक किया गया है, लेकिन सही उत्तर के रूप में चिह्न के कारण और ऊपर की ओर मुझे लगता है कि हर कोई इसे पहले से ही तय कर चुका है। – Oliver

+0

इस उत्तर के लिए धन्यवाद। बीटीडब्ल्यू यह शून्य संपत्ति मूल्यों पर अपवाद फेंक देता है। –

3

आप प्रतिबिंब के माध्यम से ऐसा कर सकते हैं।

PropertyInfo[] properties = MyClass.GetType().GetProperties(); 
foreach(PropertyInfo prop in properties) 
{ 
... 
} 
+0

MyClass.GetType() काम नहीं करेगा। आपको MyClass के उदाहरण पर GetType() को कॉल करना चाहिए। –

+0

या टाइप टाइप (MyClass) – VikciaR

1

आप वर्ग आप तो जरूरत के कोड की पहुंच है, तो आप सिर्फ ToString() विधि ओवरराइड कर सकते हैं। नहीं तो आप प्रकार वस्तु से जानकारी को पढ़ने के लिए Reflections का उपयोग कर सकते हैं:

typeof(YourClass).GetProperties() 
16

@ एक विस्तार पद्धति के रूप में ओलिवर जवाब (जो मैं सूट यह अच्छी तरह से लगता है)

public static string PropertyList(this object obj) 
{ 
    var props = obj.GetType().GetProperties(); 
    var sb = new StringBuilder(); 
    foreach (var p in props) 
    { 
    sb.AppendLine(p.Name + ": " + p.GetValue(obj, null)); 
    } 
    return sb.ToString(); 
}