লগ ইন সি # তে সম্পূর্ণ বস্তুগুলি ফেলে দেওয়ার সর্বোত্তম উপায় কী?


129

সুতরাং রানটাইমের সময় কোনও বর্তমান অবজেক্টের অবস্থা দেখার জন্য, আমি ভিজুয়াল স্টুডিও ইমিডিয়েট উইন্ডো আমাকে যা দেয় তা সত্যই পছন্দ করি। কেবল একটি সরল কাজ করছেন

? objectname

আমাকে অবজেক্টটির একটি সুন্দর বিন্যাসিত 'ডাম্প' দেবে।

কোডে এটি করার কোনও সহজ উপায় আছে, তাই আমি লগ ইন করার সময় অনুরূপ কিছু করতে পারি?


শেষ পর্যন্ত, আমি টি.ডাম্পকে কিছুটা ব্যবহার করেছি। এটি একটি দুর্দান্ত সমাধান - আপনার কেবল পুনরাবৃত্তি সম্পর্কে সতর্ক হওয়া দরকার।
ড্যান এস্পারজা

এটি একটি পুরানো প্রশ্ন, তবে প্রচুর অনুসন্ধানের হিটের শীর্ষে উঠে আসে। ভবিষ্যতের পাঠকদের জন্য: এই বনাম এক্সটেনশনটি দেখুন । ভিএস ২০১৫ সালে আমার জন্য দুর্দান্ত কাজ করেছে।
জেসি গুড

1
২০২০ সালের জন্য আপডেট করুন যেহেতু ভিএস প্লাগইন রক্ষণাবেক্ষণ করা হয়নি এবং কিছু বৈশিষ্ট্যের অভাব রয়েছে। নিম্নলিখিত লাইব্রেরি কোডে একই কাজ করে - এবং এর কয়েকটি অতিরিক্ত বৈশিষ্ট্য রয়েছে যেমন লুপগুলি এড়াতে এটি ইতিমধ্যে কোথায় গিয়েছিল তা ট্র্যাক করে: github.com/thomasgalliker/ObjectDumper
নিক ওয়েস্টগেট

উত্তর:


55

আপনি অবজেক্টডাম্পার কোডটিতে এমন কিছু বেস করতে পারেন যা এর সাথে শিপ করে লিনক নমুনাগুলি করে । একটি নমুনা পেতে
এই সম্পর্কিত প্রশ্নের উত্তরটি একবার দেখুন ।


5
এটি অ্যারেগুলির জন্যও কাজ করে না (এটি কেবল অ্যারের ধরণ এবং দৈর্ঘ্যটি প্রদর্শন করে তবে এর সামগ্রীগুলি মুদ্রণ করে না)।
কনরাড মোরাউস্কি

5
অবজেক্টডাম্পারের জন্য নিউজ প্যাকেজ এখন উপলভ্য। এছাড়া একটি এক্সটেনশন পদ্ধতি প্রদান করে DumpToStringএবং Dumpকরতে Objectবর্গ। কুশলী।
ইসমাইলস

2
w3wp.exeযখন আমি এর ObjectDumperমতো ব্যবহার করার চেষ্টা করি তখন ক্র্যাশ হয়Request.DumpToString("aaa");
পল

60

বৃহত্তর অবজেক্ট গ্রাফের জন্য, আমি জসনের ব্যবহারকে দ্বিতীয় কিন্তু কিছুটা ভিন্ন কৌশল দিয়ে with প্রথমে আমার কাছে একটি স্ট্যাটিক ক্লাস রয়েছে যা কল করা সহজ এবং একটি স্ট্যাটিক পদ্ধতি সহ যা জসন রূপান্তরটি গুটিয়ে রাখে (নোট: এটি এটিকে একটি এক্সটেনশন পদ্ধতি হিসাবে তৈরি করতে পারে)।

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উইন্ডোতে একটি ended দিয়ে প্রেন্ডেন্ড করে স্বয়ংক্রিয়ভাবে প্রদর্শিত হবে বা আপনি এটিতে একটি ঘড়ি যুক্ত করতে পারেন। Valueপরিদর্শকের কলামের ডান দিকে, পাশে একটি ড্রপডাউন ক্যারেট সহ একটি ম্যাগনিফাইং গ্লাস রয়েছে। ড্রপডাউন ক্যারেট চয়ন করুন এবং জসন ভিজ্যুয়ালাইজার চয়ন করুন।

ভিজ্যুয়াল স্টুডিও 2013 স্থানীয় উইন্ডোর স্ক্রিনশট

আমি ভিজ্যুয়াল স্টুডিও 2013 ব্যবহার করছি।


2
সিরিয়ালাইজওবিজ -> সিরিয়ালাইজ অবজেক্ট?
প্রজ্ঞাময়

উজ্জ্বল, আপনাকে ধন্যবাদ। আমি আমার রিমোট সার্ভারে ভিজ্যুয়াল স্টুডিওর জন্য ডিবাগ সরঞ্জামগুলি ইনস্টল করতে পারি না এবং এই জিনিসটি আমার এসপ নেটওয়্যার এমভিসি অ্যাপ্লিকেশনটিতে খুব ভালভাবে কাজ করে।
লিয়াম কর্নিগান

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
আপনার উত্তর দেওয়ার পরে সি # তে যুক্ত হওয়া বৈশিষ্ট্যগুলির আলোকে এই প্রশ্নের উত্তরটি কার্যকর হতে পারে যে এই প্রয়োগটি এক্সটেনশন পদ্ধতি হিসাবে দুর্দান্তভাবে কাজ করে। যদি অবজেক্ট শ্রেণিতে প্রয়োগ করা হয় এবং আপনি যেখানেই প্রয়োজন বর্ধিত রেফারেন্সটি উল্লেখ করেন তবে এটি ফাংশনটি কল করার সুবিধাজনক উপায় হতে পারে।
নিকিতা জি।

আমি এই থেকে পেয়ে রাখুন: Failed to access type 'System.__ComObject' failed। Noob to c #, সাহায্যের প্রশংসা করবে।
গাইসফট

1
@ গুয়াসফট আমি আপনার অবজেক্টের যে কোনও একটি বৈশিষ্ট্য বা নিজেই বস্তুটিকে সন্দেহ করি তা সিরিয়ালযোগ্য নয়।
বার্নহার্ড হফম্যান

দুর্ভাগ্যক্রমে, আপনি প্যারামিটারলেস কনস্ট্রাক্টর ছাড়াই ক্লাসে এই পদ্ধতিটি ব্যবহার করতে পারবেন না। সেগুলি সিরিয়ালযোগ্য নয়।
Jarekczek

22

আপনি ভিজ্যুয়াল স্টুডিও তাত্ক্ষণিক উইন্ডো ব্যবহার করতে পারেন

কেবল এটি পেস্ট করুন ( actualস্পষ্টত আপনার বস্তুর নাম পরিবর্তন করুন ):

Newtonsoft.Json.JsonConvert.SerializeObject(actual);

এটি JSON এ অবজেক্টটি মুদ্রণ করা উচিত এখানে চিত্র বর্ণনা লিখুন

আপনি এটি টেক্সটমেচেনিক পাঠ্য সরঞ্জামে বা নোটপ্যাড ++ এর অনুলিপি করতে পারবেন এবং পালানো উক্তি ( \") "এবং নিউলাইনগুলি ( \r\n) সাথে খালি স্থানের সাথে প্রতিস্থাপন করতে পারবেন , তারপরে ডাবল উদ্ধৃতিগুলি ( ") শুরু এবং শেষ থেকে সরিয়ে এবং এটি আরও পাঠযোগ্য করে তুলতে এটি jsbeautifier এ পেস্ট করুন ।

ওপির মন্তব্যে আপডেট করুন

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

এটি আপনাকে কোনও বস্তু ডাম্প করার অনুমতি দেয়।

আশা করি এটি আপনার কিছুটা সময় সাশ্রয় করবে।


ধন্যবাদ। সম্ভবত আপনি এটি আমার আসল প্রশ্নে ধরেননি, তবে আমি ইঙ্গিত দিয়েছি যে আমি ইতিমধ্যে তাত্ক্ষণিক উইন্ডোটি সম্পর্কে জানতাম এবং আমার অ্যাপটিতে লগ ইন করার সময় আমি একই জিনিসটি করতে চেয়েছিলাম।
ড্যান এস্পারজা

@ দানস্প্পারজা Console.Log(Newtonsoft.Json.JsonConvert.SerializeObject(actual));? :) এবং হ্যাঁ আমি সত্যিই এটি মিস করেছি। আপনি google.co.uk/…
মাতাস ভাইটকেভিচিয়াস

2
এফওয়াইআই, যখন আপনার সি # স্ট্রিংয়ে জেএসএন স্ট্রিং থাকে, তখন স্ট্রিংয়ের ডানদিকে স্পাইগ্লাস আইকনে ক্লিক করুন এবং পাঠ্য ভিজ্যুয়ালাইজারটি চয়ন করুন। এটি এমন একটি উইন্ডো নিয়ে আসবে যা JSON স্ট্রিংয়ের একটি সাধারণ পাঠ্য সংস্করণ দেখায় (নিখুঁত উদ্ধৃতি বা \ r \ n নয়)।
ওয়াল্টার

16

সার্ভিস স্ট্যাক.টেক্সটে একটি টি ডাম্প () এক্সটেনশন পদ্ধতি রয়েছে যা ঠিক এটি করে, পুনরাবৃত্তভাবে যে কোনও ধরণের সমস্ত বৈশিষ্ট্যকে একটি দুর্দান্ত পঠনযোগ্য ফর্ম্যাটে ডাম্প করে।

ব্যবহারের উদাহরণ:

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
@ কনরাডমোরাউস্কি ভুল সামগ্রীর অর্থ বস্তুর একটি পুনরাবৃত্ত ডাম্প, এটিতে ক্ষেত্রগুলি অন্তর্ভুক্ত নয় যা সহজেই অসীম পুনরাবৃত্ত লুপের দিকে নিয়ে যেতে পারে। অন্যেরা কী বোঝায় তা আপনার অনুমান করা উচিত নয়। আমার উত্তর প্রাসঙ্গিক এবং সহায়ক উভয়, আপনার ডাউন ভোট + মন্তব্য নয়।
mythz

1
@ মাইথজ হ্যাঁ অবশ্যই আপনার একটি স্ট্যাকের ওভারফ্লো প্রতিরোধ করা প্রয়োজন (উদাঃ প্রতিটি Int32ক্ষেত্রের একটি MaxValueক্ষেত্র রয়েছে যা একটি Int32নিজস্ব ...) এটি একটি ভাল পয়েন্ট তবে এটি বাস্তবে অবজেক্ট - এবং অবশ্যই পুরোগুলি পরিবর্তন করে না - ক্ষেত্রগুলিও রয়েছে, কেবলমাত্র বৈশিষ্ট্যগুলিও নয়। আরো কি (যদি আপনি যে এক সুরাহা হয়নি), ? objectnameমধ্যে Immediate Window আছে প্রদর্শন ক্ষেত্রের - একটি অসীম লুপ triggering ছাড়া। যদি এটি আমার ডাউনটাতে হয় তবে আমি এটিকে প্রত্যাহার করতে পারি (যদি আপনি আমাকে এটি আনলক করে দিয়ে দেন তবে তা)। আমি যাই হোক না কেন নীতিগতভাবে একমত।
কনরাড মোরাউস্কি

4
-1 মূলত একটি লিঙ্ক-কেবল উত্তরের জন্য, যদিও আমি এটি ব্যবহার করতে পারি তবে দুর্দান্ত লাগে! সম্ভবত আমি অন্ধ, তবে আমি সেই লিঙ্কটির মাধ্যমে উত্স খুঁজে পাচ্ছি না; দুটি আপলোড ফোল্ডার খালি। কোডটি উত্তরের অন্তর্ভুক্ত করার জন্য কি খুব দীর্ঘ?

14

ফ্ল্যাট অবজেক্ট লেখার জন্য এখানে বোকামি করার সহজ উপায়, সুন্দরভাবে ফর্ম্যাট করা হয়েছে:

using Newtonsoft.Json.Linq;

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

যা চলছে তা হ'ল অবজেক্টটি প্রথমে দ্বারা একটি JSON অভ্যন্তরীণ উপস্থাপনায় JObject.FromObjectরূপান্তরিত হয় এবং তারপরে JSON স্ট্রিংয়ে রূপান্তরিত হয় ToString। (এবং অবশ্যই একটি জেএসওএন স্ট্রিং একটি সাধারণ অবজেক্টের খুব সুন্দর উপস্থাপনা, বিশেষত যেহেতু ToStringনিউলাইন এবং ইনডেন্টগুলি অন্তর্ভুক্ত করবে।) "টোস্ট্রিং" অবশ্যই বহিরাগত (যেমন এটি +স্ট্রিং এবং অবজেক্টের সাথে সংযুক্ত করে বোঝানো হয়েছে ) তবে আমি এখানে এটি নির্দিষ্ট করতে চাই।


5
লগতে স্বাচ্ছন্দ্যপূর্ণ পড়া জন্য জসনকনভার্ট.সিরাইলাইজ অবজেক্ট (প্রশংসা করুন, বিন্যাসকরণ করুন)
ইস্যু করুন

1
হটলিক্স - এই মুহুর্তে আমার জন্য এই অবদানটি কতটা গুরুত্বপূর্ণ তা আমি আপনাকে জানাতে চাই। আপডেটের সময় কী বদলেছে তার একটি নিরীক্ষণ সরবরাহ করার জন্য আমার প্রয়োজন রয়েছে এবং আপনি আমার আতঙ্ককে 'আতঙ্কিত' স্তর থেকে একটি পরিচালনাযোগ্য 'উদ্বেগ' স্তরে নিয়ে এসেছেন। ধন্যবাদ স্যার, আপনার খুব দীর্ঘ এবং আশীর্বাদপূর্ণ জীবন থাকতে পারে
Iofacture

4

আপনি সমস্ত বস্তুর বৈশিষ্ট্যগুলির মধ্যে প্রতিফলন এবং লুপ ব্যবহার করতে পারেন, তারপরে তাদের মানগুলি পাবেন এবং লগতে সেভ করুন। ফর্ম্যাটিংটি সত্যিই তুচ্ছ (আপনি কোনও বস্তুর বৈশিষ্ট্য এবং এর মান যুক্ত করতে \ t ব্যবহার করতে পারেন):

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

4

আমি যা করতে চাই তা টুস্ট্রিং () কে ওভাররাইড করা হয় যাতে আমি টাইপের নামের বাইরে আরও দরকারী আউটপুট পাই। এটি ডিবাগারে কার্যকর, আপনি কোনও অবজেক্টের সম্পর্কে প্রসারিত করার প্রয়োজন ছাড়াই যে তথ্য চান তা দেখতে পাচ্ছেন।



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আপনার অভ্যন্তরীণ বস্তুতে যদি কোনও সম্পত্তি থাকে তবে এটি মারাত্মকভাবে মারা যাবে ... কেবল বলছে ...
নোট্টিস

2

আপনি আপনার নিজস্ব রাইটলাইন পদ্ধতি লিখতে পারেন-

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ইন্টারফেস, অ্যাট্রিবিউটস, বেস টাইপ ইত্যাদি ব্যবহার এবং পরীক্ষা করা এবং পুনরাবৃত্তি (যেমন এটি একটি পুনরাবৃত্ত পদ্ধতি) এইভাবে আমরা কোনও অবজেক্ট ডাম্পার অর্জন করতে পারি তবে এটি নিশ্চিতভাবে ক্লান্তিকর। মাইক্রোসফ্টের লিনকিউ নমুনা থেকে অবজেক্ট ডাম্পার ব্যবহার করা আপনার সময় সাশ্রয় করতে পারে।


কৌতূহলের বাইরে: এই হ্যান্ডেলটি কীভাবে অ্যারে বা তালিকা তৈরি করে? বা বৈশিষ্ট্য যা পিতামাতার অবজেক্টগুলিকে উল্লেখ করে?
ড্যান এস্পার্জা

@ ড্যানস্পারজা আমাকে আরও সুনির্দিষ্ট হওয়ার উপায় দেখানোর জন্য ধন্যবাদ Thanks
আরিফুল ইসলাম

2

@ এঞ্জিনফোর্স উত্তরের ভিত্তিতে, আমি এই ক্লাসটি তৈরি করেছিলাম যা আমি একটি জ্যামারিন সলিউশনের একটি পিসিএল প্রকল্পে ব্যবহার করছি:

/// <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

উপরের সমস্ত পাথ ধরে ধরেছে যে আপনার বস্তুগুলি এক্সএমএল বা জেএসএন-তে সিরিয়ালাইজযোগ্য,
বা আপনাকে অবশ্যই নিজের সমাধানটি প্রয়োগ করতে হবে।

তবে শেষ পর্যন্ত আপনি এখনও সেই পয়েন্টে পৌঁছাতে পারেন যেখানে আপনাকে যেমন সমস্যার সমাধান করতে হবে

  • অবজেক্টে পুনরাবৃত্তি
  • অ সিরিয়ালাইজযোগ্য বস্তু
  • ব্যতিক্রম
  • ...

প্লাস লগ আপনি আরও তথ্য চান:

  • যখন ঘটনাটি ঘটেছে
  • callstack
  • যা থ্রিড
  • ওয়েব সেশনে কি ছিল
  • কোন আইপি ঠিকানা
  • URL
  • ...

সর্বোত্তম সমাধান যা এই সমস্তগুলি সমাধান করে এবং আরও অনেক কিছু করে।
এই Nuget প্যাকেজ ব্যবহার করুন: Desharp
সমস্ত ধরণের অ্যাপ্লিকেশন - উভয় ওয়েব এবং ডেস্কটপ অ্যাপ্লিকেশন
দেখুন এটি দেশার গিথুব ডকুমেন্টেশন । এটিতে অনেকগুলি কনফিগারেশন বিকল্প রয়েছে

কেবল যে কোনও জায়গায় কল করুন:

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
  • এটি লগটিকে সুন্দর এইচটিএমএল (বা পাঠ্য বিন্যাসে, কনফিগারযোগ্য) সংরক্ষণ করতে পারে
  • পটভূমির থ্রেডে বৈকল্পিকভাবে লেখা সম্ভব (কনফিগারযোগ্য)
  • এটিতে সর্বোচ্চ বস্তুর গভীরতা এবং সর্বোচ্চ স্ট্রিং দৈর্ঘ্যের (কনফিগারযোগ্য) বিকল্প রয়েছে
  • এটি পুনরুক্তিযোগ্য অবজেক্টের জন্য লুপগুলি এবং অন্য সমস্ত কিছুর জন্য পশ্চাদপটে প্রতিবিম্বটি ব্যবহার করে,
    প্রকৃতপক্ষে । নেট পরিবেশে আপনি যে কোনও কিছুর সন্ধান করতে পারেন

আমি বিশ্বাস করি এটি সাহায্য করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.