C # में लॉग करने के लिए संपूर्ण ऑब्जेक्ट्स को डंप करने का सबसे अच्छा तरीका क्या है?


129

इसलिए रनटाइम पर एक वर्तमान ऑब्जेक्ट की स्थिति को देखने के लिए, मुझे वास्तव में पसंद है कि विज़ुअल स्टूडियो तत्काल खिड़की मुझे क्या देती है। बस एक सरल कर रहा है

? objectname

मुझे वस्तु का एक अच्छा स्वरूपित 'डंप' देगा।

क्या कोड में ऐसा करने का एक आसान तरीका है, इसलिए मैं लॉग इन करते समय कुछ ऐसा ही कर सकता हूं?


अंत में, मैंने T.Dump का काफी उपयोग किया है। यह एक बहुत ठोस समाधान है - आपको बस पुनरावृत्ति से सावधान रहने की आवश्यकता है।
Dan Esparza

यह एक पुराना प्रश्न है, लेकिन बहुत सारे खोज हिट में सबसे ऊपर आता है। भविष्य के पाठकों के लिए: यह बनाम एक्सटेंशन देखें । VS2015 में मेरे लिए बहुत अच्छा काम किया।
जेसी गुड

1
2020 से अपडेट है क्योंकि वीएस प्लगइन का रखरखाव नहीं है और कुछ सुविधाओं का अभाव है। निम्न पुस्तकालय कोड में एक ही काम करता है - और इसमें कुछ अतिरिक्त विशेषताएं हैं, जैसे यह ट्रैक करता है जहां यह पहले से ही छोरों से बचने के लिए दौरा किया गया है: github.com/thomasgalliker/ObjectDumper
Nick Westgate

जवाबों:


55

आप ObjectDumper कोड पर कुछ आधार बना सकते हैं जो Linq नमूनों के साथ जहाज करता है । एक नमूना पाने के लिए
इस संबंधित प्रश्न के उत्तर पर भी एक नज़र डालें ।


5
यह सरणियों के लिए भी काम नहीं करता है (यह सिर्फ प्रकार और सरणी की लंबाई प्रदर्शित करता है, लेकिन इसकी सामग्री को प्रिंट नहीं करता है)।
कोनराड मोरावस्की

5
ऑब्जेक्ट के लिए nuget पैकेज अब उपलब्ध है। यह भी एक विस्तार तरीका प्रदान करता है DumpToStringऔर Dumpकरने के लिए Objectवर्ग। हैंडी।
इस्माइल

2
w3wp.exeदुर्घटनाओं जब मैं उपयोग करने का प्रयास ObjectDumperकी तरहRequest.DumpToString("aaa");
पॉल

60

एक बड़े ऑब्जेक्ट ग्राफ के लिए, मैं Json का उपयोग करता हूं, लेकिन थोड़ी अलग रणनीति के साथ। पहले मेरे पास एक स्थिर वर्ग है जिसे कॉल करना आसान है और एक स्थिर विधि के साथ जो कि जसन रूपांतरण को लपेटता है (ध्यान दें: यह एक विस्तार कर सकता है)।

using Newtonsoft.Json;

public static class F
{
    public static string Dump(object obj)
    {
        return JsonConvert.SerializeObject(obj);
    }
}

फिर अपने में Immediate Window,

var lookHere = F.Dump(myobj);

लुक हिरन Localsएक $ के साथ पूर्वनिर्मित विंडो में दिखाई देगा या आप इसमें एक घड़ी जोड़ सकते हैं। Valueइंस्पेक्टर में कॉलम के दाहिने हाथ में, बगल में एक ड्रॉपडाउन कैरेट के साथ एक आवर्धक कांच होता है। ड्रॉपडाउन कैरेट चुनें और Json विज़ुअलाइज़र चुनें।

दृश्य स्टूडियो 2013 स्थानीय विंडो का स्क्रीनशॉट

मैं विजुअल स्टूडियो 2013 का उपयोग कर रहा हूं।


2
SerializeObj -> SerializeObject?
वाइसमैन

शानदार, धन्यवाद। मैं अपने दूरस्थ सर्वर पर Visual Studio के लिए डीबग उपकरण स्थापित नहीं कर सकता, और यह बात मेरे asp.net mvc ऐप में बहुत अच्छी तरह से काम करती है।
लियाम कर्निघन

1
अच्छे स्वरूपण के लिए आप कर सकते हैं:Newtonsoft.Json.JsonConvert.SerializeObject(sampleData, Formatting.Indented)
जोर्गारथ

हाथ से करने की कोशिश करने की तुलना में बहुत आसान है। यह जटिल हो जाता है
अहोंग

26

मुझे यकीन है कि ऐसा करने के बेहतर तरीके हैं, लेकिन मैंने अतीत में एक विधि का उपयोग किया है जैसे कि किसी वस्तु को स्ट्रिंग में क्रमबद्ध करने के लिए जो मैं लॉग इन कर सकता हूं:

  private string ObjectToXml(object output)
  {
     string objectAsXmlString;

     System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(output.GetType());
     using (System.IO.StringWriter sw = new System.IO.StringWriter())
     {
        try
        {
           xs.Serialize(sw, output);
           objectAsXmlString = sw.ToString();
        }
        catch (Exception ex)
        {
           objectAsXmlString = ex.ToString();
        }
     }

     return objectAsXmlString;
  }

आप देखेंगे कि विधि क्रमबद्ध ऑब्जेक्ट के बजाय अपवाद को भी लौटा सकती है, इसलिए आप यह सुनिश्चित करना चाहेंगे कि आप जिन वस्तुओं को लॉग इन करना चाहते हैं, वे क्रमबद्ध हों।


2
आपके द्वारा उत्तर दिए जाने के बाद C # में जोड़ी गई सुविधाओं के प्रकाश में यह प्रश्न उपयोगी हो सकता है कि यह कार्यान्वयन एक विस्तार विधि के रूप में अच्छी तरह से काम करता है। यदि ऑब्जेक्ट क्लास पर लागू किया जाता है और आप हर जगह एक्सटेंशन का संदर्भ देते हैं, तो आपको फ़ंक्शन को कॉल करने का एक सुविधाजनक तरीका हो सकता है।
निकिता जी।

मैं इससे मिलता रहता हूं Failed to access type 'System.__ComObject' failed:। Noob to c #, मदद की सराहना करेगा।
गाईसॉफ्ट

1
@GuySoft मुझे आपकी वस्तु, या वस्तु पर मौजूद गुणों में से एक पर संदेह है, यह धारावाहिक नहीं है।
बर्नहार्ड हॉफमैन

आप इस पद्धति का उपयोग पैरामीटर रहित निर्माता के बिना कक्षाओं में नहीं कर सकते, दुर्भाग्य से। वे क्रमबद्ध नहीं हैं।
जेरेकसेक

22

आप विजुअल स्टूडियो इमीडिएट विंडो का उपयोग कर सकते हैं

बस इसे पेस्ट करें ( actualअपने ऑब्जेक्ट का नाम स्पष्ट रूप से बदलें ):

Newtonsoft.Json.JsonConvert.SerializeObject(actual);

इसे JSON में ऑब्जेक्ट प्रिंट करना चाहिए यहाँ छवि विवरण दर्ज करें

आपको इसे textmechanic text tool या notepad ++ पर कॉपी करने में सक्षम होना चाहिए और खाली जगह के साथ escaped quotes ( \") with "और newlines ( \r\n) को बदलना चाहिए , फिर "शुरुआत और अंत से डबल कोट्स ( ) को हटा दें और इसे और अधिक पठनीय बनाने के लिए jsbeautifier पर पेस्ट करें ।

ओपी की टिप्पणी के लिए अद्यतन करें

public static class Dumper
{
    public static void Dump(this object obj)
    {
        Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(obj)); // your logger
    }
}

यह आपको किसी भी वस्तु को डंप करने की अनुमति देनी चाहिए।

आशा है कि यह आपको कुछ समय बचाता है।


धन्यवाद। शायद आपने इसे मेरे मूल प्रश्न में नहीं पकड़ा था, लेकिन मैंने संकेत दिया कि मैं पहले से ही तत्काल खिड़की के बारे में जानता था, और मैं अपने ऐप में लॉग इन करते समय यही काम करना चाहता था।
दान एस्परज़ा

@DanEsparza Console.Log(Newtonsoft.Json.JsonConvert.SerializeObject(actual));? :) और हाँ, मैं वास्तव में इसे याद किया। जब आप google.co.uk/…
Matas Vaitkevicius

2
FYI करें, जब आपके पास C # स्ट्रिंग में JSON स्ट्रिंग होती है, तो स्ट्रिंग के दाईं ओर स्पाईग्लास आइकन पर क्लिक करें और Text Visualizer चुनें। यह एक ऐसी विंडो लाएगा जो JSON स्ट्रिंग का एक सादा पाठ संस्करण दिखाती है (उद्धरण या \ r \ n बच नहीं)।
वाल्टर

16

ServiceStack.Text में एक T.Dump () एक्सटेंशन विधि है जो वास्तव में ऐसा करती है, एक अच्छा पठनीय प्रारूप में किसी भी प्रकार के सभी गुणों को पुनरावर्ती बनाती है।

उदाहरण उपयोग:

var model = new TestModel();
Console.WriteLine(model.Dump());

और उत्पादन:

{
    Int: 1,
    String: One,
    DateTime: 2010-04-11,
    Guid: c050437f6fcd46be9b2d0806a0860b3e,
    EmptyIntList: [],
    IntList:
    [
        1,
        2,
        3
    ],
    StringList:
    [
        one,
        two,
        three
    ],
    StringIntMap:
    {
        a: 1,
        b: 2,
        c: 3
    }
}

1
यह खेतों के लिए काम नहीं करता है। ओपी स्पष्ट रूप से "संपूर्ण वस्तुओं" के बारे में पूछ रहा था।
कोनराड मोरावस्की

5
He didn't say fields- उन्होंने कहा entire objects, जिसमें क्षेत्र शामिल हैं। उन्होंने विज़ुअल स्टूडियो की तत्काल विंडो सुविधा का भी उल्लेख किया, उदाहरण के लिए कि वह क्या हासिल करना चाहते थे ( "बस एक सरल काम करने ? objectnameसे मुझे ऑब्जेक्ट का एक अच्छी तरह से स्वरूपित डंप होगा" )। ? objectnameसभी क्षेत्रों को प्रिंट करता है। This has been immensely helpful - one of my most used extension methods to date- मैं सवाल नहीं कर रहा कि यह उपयोगी है, केवल यह कि यह पूरी वस्तुओं को डंप करता है।
कोनराड मोरावस्की

3
@KonradMorawski पूरी वस्तुओं का अर्थ है ऑब्जेक्ट का एक पुनरावर्ती डंप, न कि इसमें फ़ील्ड शामिल हैं, जिससे आसानी से अनंत पुनरावर्ती लूप हो सकता है। आपको यह नहीं समझना चाहिए कि दूसरे क्या कर रहे हैं। मेरा उत्तर प्रासंगिक और सहायक दोनों है, आपका डाउन वोट + टिप्पणी नहीं है।
मिथक

1
@mythz हाँ, आपको एक स्टैक ओवरफ़्लो को रोकने की आवश्यकता है (उदाहरण के लिए। प्रत्येक Int32फ़ील्ड में एक MaxValueफ़ील्ड है, जो Int32स्वयं है ...), यह एक अच्छा बिंदु है, लेकिन यह इस तथ्य को नहीं बदलता है - ऑब्जेक्ट और निश्चित रूप से पूरे - खेतों से मिलकर, भी, सिर्फ गुण नहीं। इतना ही नहीं (आपको लगता है कि एक पते नहीं था), ? objectnameमें Immediate Window करता है प्रदर्शन क्षेत्रों - एक अनंत लूप ट्रिगर किए बिना। अगर यह मेरे पतन के बारे में है, तो मैं इसे वापस ले सकता हूं (यदि आप इसे अनलॉक करके मुझे जाने देते हैं, तो वह है)। मैं वैसे भी सिद्धांत में असहमत हूं।
कोनराड मोरावस्की

4
-1 अनिवार्य रूप से लिंक-ओनली उत्तर के लिए, हालाँकि यह बहुत अच्छा लगता है अगर मैं इसका उपयोग कर सकता हूँ! शायद मैं अंधा हूं, लेकिन मुझे उस लिंक के माध्यम से स्रोत नहीं मिल रहा है; दो अपलोड फ़ोल्डर खाली हैं। क्या कोड उत्तर में शामिल करने के लिए बहुत लंबा है?

14

यहाँ एक सपाट वस्तु लिखने का एक सरल तरीका है, अच्छी तरह से स्वरूपित:

using Newtonsoft.Json.Linq;

Debug.WriteLine("The object is " + JObject.FromObject(theObjectToDump).ToString());

क्या चल रहा है कि वस्तु को पहले JSON आंतरिक प्रतिनिधित्व द्वारा JObject.FromObjectपरिवर्तित किया जाता है , और फिर JSON स्ट्रिंग द्वारा परिवर्तित किया जाता है ToString। (और निश्चित रूप से एक JSON स्ट्रिंग एक साधारण वस्तु का एक बहुत अच्छा प्रतिनिधित्व है, खासकर जब ToStringसे इसमें newlines और indents शामिल होंगे।) "ToString" निश्चित रूप से बहिर्मुखी है (जैसा कि यह +एक स्ट्रिंग और एक वस्तु को सम्‍मिलित करके उपयोग किया जाता है), लेकिन मैं इसे यहाँ निर्दिष्ट करना पसंद करता हूँ।


5
JsonConvert.SerializeObject (apprec, Formatting.ndented) लॉग में आरामदायक पढ़ने के लिए
Tertium

1
HotLicks - मैं आपको बताना चाहता हूं कि यह योगदान मेरे लिए कितना महत्वपूर्ण है। मुझे एक अपडेट के दौरान जो कुछ भी बदला है, उसका ऑडिट प्रदान करने की आवश्यकता है और आपने मेरा तनाव 'पैनिक ’स्तर से वापस एक प्रबंधनीय a चिंता’ स्तर तक ले लिया है। धन्यवाद सर, आपका बहुत लंबा और धन्य जीवन हो सकता है
Iofacture

4

आप सभी ऑब्जेक्ट गुणों के माध्यम से प्रतिबिंब और लूप का उपयोग कर सकते हैं, फिर उनके मान प्राप्त करें और उन्हें लॉग में सहेजें। स्वरूपण वास्तव में तुच्छ है (आप एक ऑब्जेक्ट गुणों और उसके मूल्यों को इंडेंट करने के लिए \ t का उपयोग कर सकते हैं):

MyObject
    Property1 = value
    Property2 = value2
    OtherObject
       OtherProperty = value ...

4

मुझे जो करना पसंद है वह ToString () को ओवरराइड करना है ताकि मुझे टाइप नाम से परे अधिक उपयोगी आउटपुट मिले। डिबगर में यह आसान है, आप किसी वस्तु के बारे में जो जानकारी चाहते हैं, उसे बिना विस्तार के देख सकते हैं।


3

मैं एक पुस्तकालय बुलाया पाया ObjectPrinter जो आसानी से तार (और अधिक) के लिए वस्तुओं और संग्रह डंप करने के लिए अनुमति देता है। यह वही करता है जो मुझे चाहिए था।


3

निम्नलिखित एक और संस्करण है जो समान कार्य करता है (और नेस्टेड गुणों को संभालता है), जो मुझे लगता है कि सरल है (बाहरी पुस्तकालयों पर कोई निर्भरता नहीं है और लॉगिंग के अलावा अन्य चीजों को करने के लिए आसानी से संशोधित किया जा सकता है):

public class ObjectDumper
{
    public static string Dump(object obj)
    {
        return new ObjectDumper().DumpObject(obj);
    }

    StringBuilder _dumpBuilder = new StringBuilder();

    string DumpObject(object obj)
    {
        DumpObject(obj, 0);
        return _dumpBuilder.ToString();
    }

    void DumpObject(object obj, int nestingLevel = 0)
    {
        var nestingSpaces = "".PadLeft(nestingLevel * 4);

        if (obj == null)
        {
            _dumpBuilder.AppendFormat("{0}null\n", nestingSpaces);
        }
        else if (obj is string || obj.GetType().IsPrimitive)
        {
            _dumpBuilder.AppendFormat("{0}{1}\n", nestingSpaces, obj);
        }
        else if (ImplementsDictionary(obj.GetType()))
        {
            using (var e = ((dynamic)obj).GetEnumerator())
            {
                var enumerator = (IEnumerator)e;
                while (enumerator.MoveNext())
                {
                    dynamic p = enumerator.Current;

                    var key = p.Key;
                    var value = p.Value;
                    _dumpBuilder.AppendFormat("{0}{1} ({2})\n", nestingSpaces, key, value != null ? value.GetType().ToString() : "<null>");
                    DumpObject(value, nestingLevel + 1);
                }
            }
        }
        else if (obj is IEnumerable)
        {
            foreach (dynamic p in obj as IEnumerable)
            {
                DumpObject(p, nestingLevel);
            }
        }
        else
        {
            foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(obj))
            {
                string name = descriptor.Name;
                object value = descriptor.GetValue(obj);

                _dumpBuilder.AppendFormat("{0}{1} ({2})\n", nestingSpaces, name, value != null ? value.GetType().ToString() : "<null>");
                DumpObject(value, nestingLevel + 1);
            }
        }
    }

    bool ImplementsDictionary(Type t)
    {
        return t.GetInterfaces().Any(i => i.Name.Contains("IDictionary"));
    }
}

1
यह बहुत बुरी तरह से मर जाएगा अगर आपके पास Dateअपनी आंतरिक वस्तु है ... बस कह रहा है ...
Noctis

2

आप अपनी खुद की WriteLine विधि लिख सकते हैं-

public static void WriteLine<T>(T obj)
    {
        var t = typeof(T);
        var props = t.GetProperties();
        StringBuilder sb = new StringBuilder();
        foreach (var item in props)
        {
            sb.Append($"{item.Name}:{item.GetValue(obj,null)}; ");
        }
        sb.AppendLine();
        Console.WriteLine(sb.ToString());
    }

इसका उपयोग करें जैसे-

WriteLine(myObject);

एक संग्रह लिखने के लिए हम उपयोग कर सकते हैं-

 var ifaces = t.GetInterfaces();
        if (ifaces.Any(o => o.Name.StartsWith("ICollection")))
        {

            dynamic lst = t.GetMethod("GetEnumerator").Invoke(obj, null);
            while (lst.MoveNext())
            {
                WriteLine(lst.Current);
            }
        }   

विधि की तरह लग सकता है-

 public static void WriteLine<T>(T obj)
    {
        var t = typeof(T);
        var ifaces = t.GetInterfaces();
        if (ifaces.Any(o => o.Name.StartsWith("ICollection")))
        {

            dynamic lst = t.GetMethod("GetEnumerator").Invoke(obj, null);
            while (lst.MoveNext())
            {
                WriteLine(lst.Current);
            }
        }            
        else if (t.GetProperties().Any())
        {
            var props = t.GetProperties();
            StringBuilder sb = new StringBuilder();
            foreach (var item in props)
            {
                sb.Append($"{item.Name}:{item.GetValue(obj, null)}; ");
            }
            sb.AppendLine();
            Console.WriteLine(sb.ToString());
        }
    }

if, else ifइंटरफेस, एट्रिब्यूट्स, बेस टाइप इत्यादि का उपयोग करना और पुनरावर्तन (जैसा कि यह एक पुनरावर्ती विधि है) का उपयोग करके इस तरह से हम एक ऑब्जेक्ट डम्पर प्राप्त कर सकते हैं, लेकिन यह सुनिश्चित करने के लिए थकाऊ है। Microsoft के LINQ नमूना से ऑब्जेक्ट डम्पर का उपयोग करने से आपका समय बचेगा।


जिज्ञासा से बाहर: यह सरणियों या सूचियों को कैसे संभालता है? या माता-पिता की वस्तुओं का संदर्भ देने वाले गुण?
दान एस्पेरज़ा

@DanEsparza मुझे और अधिक विशिष्ट होने का रास्ता दिखाने के लिए धन्यवाद।
अरफुल इस्लाम

2

@Engineforce के उत्तर के आधार पर, मैंने इस वर्ग को बनाया जो कि मैं एक Xamarin समाधान के पीसीएल प्रोजेक्ट में उपयोग कर रहा हूं:

/// <summary>
/// Based on: https://stackoverflow.com/a/42264037/6155481
/// </summary>
public class ObjectDumper
{
    public static string Dump(object obj)
    {
        return new ObjectDumper().DumpObject(obj);
    }

    StringBuilder _dumpBuilder = new StringBuilder();

    string DumpObject(object obj)
    {
        DumpObject(obj, 0);
        return _dumpBuilder.ToString();
    }

    void DumpObject(object obj, int nestingLevel)
    {
        var nestingSpaces = "".PadLeft(nestingLevel * 4);

        if (obj == null)
        {
            _dumpBuilder.AppendFormat("{0}null\n", nestingSpaces);
        }
        else if (obj is string || obj.GetType().GetTypeInfo().IsPrimitive || obj.GetType().GetTypeInfo().IsEnum)
        {
            _dumpBuilder.AppendFormat("{0}{1}\n", nestingSpaces, obj);
        }
        else if (ImplementsDictionary(obj.GetType()))
        {
            using (var e = ((dynamic)obj).GetEnumerator())
            {
                var enumerator = (IEnumerator)e;
                while (enumerator.MoveNext())
                {
                    dynamic p = enumerator.Current;

                    var key = p.Key;
                    var value = p.Value;
                    _dumpBuilder.AppendFormat("{0}{1} ({2})\n", nestingSpaces, key, value != null ? value.GetType().ToString() : "<null>");
                    DumpObject(value, nestingLevel + 1);
                }
            }
        }
        else if (obj is IEnumerable)
        {
            foreach (dynamic p in obj as IEnumerable)
            {
                DumpObject(p, nestingLevel);
            }
        }
        else
        {
            foreach (PropertyInfo descriptor in obj.GetType().GetRuntimeProperties())
            {
                string name = descriptor.Name;
                object value = descriptor.GetValue(obj);

                _dumpBuilder.AppendFormat("{0}{1} ({2})\n", nestingSpaces, name, value != null ? value.GetType().ToString() : "<null>");

                // TODO: Prevent recursion due to circular reference
                if (name == "Self" && HasBaseType(obj.GetType(), "NSObject"))
                {
                    // In ObjC I need to break the recursion when I find the Self property
                    // otherwise it will be an infinite recursion
                    Console.WriteLine($"Found Self! {obj.GetType()}");
                }
                else
                {
                    DumpObject(value, nestingLevel + 1);
                }
            }
        }
    }

    bool HasBaseType(Type type, string baseTypeName)
    {
        if (type == null) return false;

        string typeName = type.Name;

        if (baseTypeName == typeName) return true;

        return HasBaseType(type.GetTypeInfo().BaseType, baseTypeName);
    }

    bool ImplementsDictionary(Type t)
    {
        return t is IDictionary;
    }
}

0

ऊपर दिए गए सभी पथ यह मानते हैं कि आपकी वस्तुएँ XML या JSON पर क्रमिक हैं,
या आपको अपना स्वयं का समाधान लागू करना चाहिए।

लेकिन अंत में आप अभी भी उस बिंदु पर पहुंच जाते हैं जहां आपको समस्याओं को हल करना होगा

  • वस्तुओं में पुनरावृत्ति
  • गैर-अनुक्रमिक वस्तुएँ
  • अपवाद
  • ...

प्लस लॉग आप अधिक जानकारी चाहते हैं:

  • जब घटना हुई
  • कॉल स्टैक
  • जो थर्राता है
  • वेब सत्र में क्या था
  • कौन सा आईपी पता
  • यूआरएल
  • ...

सबसे अच्छा समाधान है जो इस सब को हल करता है और बहुत कुछ।
इस Nuget पैकेज का उपयोग करें: देशप
सभी प्रकार के अनुप्रयोगों के लिए - दोनों वेब और डेस्कटॉप अनुप्रयोग
यह देशप जिठु प्रलेखन देखें । इसमें कई कॉन्फ़िगरेशन विकल्प हैं

बस कहीं भी कॉल करें:

Desharp.Debug.Log(anyException);
Desharp.Debug.Log(anyCustomValueObject);
Desharp.Debug.Log(anyNonserializableObject);
Desharp.Debug.Log(anyFunc);
Desharp.Debug.Log(anyFunc, Desharp.Level.EMERGENCY); // you can store into different files
  • यह लॉग को अच्छे HTML में सहेज सकता है (या पाठ प्रारूप में, विन्यास योग्य)
  • वैकल्पिक रूप से पृष्ठभूमि थ्रेड में लिखना संभव है (कॉन्फ़िगर करने योग्य)
  • इसमें अधिकतम वस्तुओं की गहराई और अधिकतम तार की लंबाई (कॉन्फ़िगर करने योग्य) के विकल्प हैं
  • यह iteratable वस्तुओं के लिए छोरों का उपयोग करता है और बाकी सब कुछ के लिए पिछड़े प्रतिबिंब,
    वास्तव में कुछ भी आप .NET वातावरण में पा सकते हैं

मुझे विश्वास है कि यह मदद करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.