সি # তে গতিশীল বেনামে ধরণের কোনও সম্পত্তি উপস্থিত রয়েছে কিনা তা আমি কীভাবে চেক করব?


121

আমার একটি বেনামি ধরণের অবজেক্ট রয়েছে যা আমি সেই পদ্ধতি থেকে গতিশীল হিসাবে পেয়েছি যে কোনও জিনিসটিতে আমি যাচাই করতে চাই that অবজেক্টটিতে বিদ্যমান।

....
var settings = new {
                   Filename="temp.txt",
                   Size=10
}
...

function void Settings(dynamic settings) {
var exists = IsSettingExist(settings,"Filename")
}

আমি কীভাবে ইসসেটিংএক্সিস্ট প্রয়োগ করব?



আপনি যদি নিজের আত্মাকে গতিশীল অবজেক্টের উপর ভারী নির্ভর করতে দেখেন তবে এটি সম্ভবত এফ # এর দিকে তাকাতে উপযুক্ত - উপায়টি দ্বারা ভাল অবতার
পাইওত্রার কুলা

উত্তর:


149
  public static bool IsPropertyExist(dynamic settings, string name)
  {
    if (settings is ExpandoObject)
      return ((IDictionary<string, object>)settings).ContainsKey(name);

    return settings.GetType().GetProperty(name) != null;
  }

  var settings = new {Filename = @"c:\temp\q.txt"};
  Console.WriteLine(IsPropertyExist(settings, "Filename"));
  Console.WriteLine(IsPropertyExist(settings, "Size"));

আউটপুট:

 True
 False

2
এটি গতিশীল বস্তুগুলিতে কাজ করে না। এটি সর্বদা নালায় ফিরে আসে।
অষ্টম

@ ইভিলম @ শিখস্তার_কাস্তি আপনি কি এমভিসি দিয়ে এই পদ্ধতিটি ব্যবহার করার চেষ্টা করছেন ViewBag? যদি তা হয় তবে স্ট্যাকওভারফ্লো.com
ইয়ান কেম্প

7
আসল প্রশ্ন: কেন প্রপোর্টিএক্সিস্ট / হ্যাসপ্রপার্টি পরিবর্তে ইস্প্রোপার্টিএক্সজিস্ট? এটা কি কোন কনভেনশন আমি বুঝতে পারি না?
গ্যাসপা79

@ Gaspa79। এটি একটি অস্বাভাবিক কোডিং কনভেনশন। কিছু লোকেরা সমস্ত বুলিয়ান বৈশিষ্ট্যে "ইস" উপসর্গের মতো থাকে। এর মতো ধারাবাহিকতা আপনাকে সনাক্তকারীটির প্রথম কয়েকটি অক্ষর (যার পরে, ইন্টেলিসেন্স কাজ করে) অনুমান করা থেকে বাধা দিতে পারে, তবে এই জাতীয় ক্ষেত্রে কিছুটা বিশ্রী ইংরেজি করার ব্যয়ে।
দ্রাবকফিশ

আমি Isউপসর্গের অবৈধ ক্রিয়া কালকে অন্যরকম ব্যবহার করার চেয়ে বিভ্রান্তিকর বলে মনে করি HasProperty। আমি আরও বলব যে এর মতো ব্যাকরণগতভাবে-ভুল উপসর্গটি ব্যবহার করা আসলে সি-তে অ-প্রতিচ্ছবিযুক্ত is
বেন কলিন্স

37
public static bool HasProperty(dynamic obj, string name)
{
    Type objType = obj.GetType();

    if (objType == typeof(ExpandoObject))
    {
        return ((IDictionary<string, object>)obj).ContainsKey(name);
    }

    return objType.GetProperty(name) != null;
}

objType.GetProperty(name) != null;যে বৈশিষ্ট্য রয়েছে তা বাতিল করে দেয়
Matas Vaitkevicius

3
objType.GetProperty(name) != nullসর্বদা একটি ফেরত আসবে bool, যা (সংজ্ঞা অনুসারে) কখনও হতে পারে না null
অ্যালেক্স ম্যাকমিলান

@ অ্যালেক্সমিসমিলান নিশ্চিত নন যে আপনি কোন মাত্রায় বাস করছেন যেখানে Type.GetProperty(string)অস্তিত্বহীন সম্পত্তির জন্য নাল ব্যতীত অন্য কোনও কিছু ফেরত পাওয়া যায় না।
ইয়ান কেম্প

2
@ ইয়ানক্যাম্প, অ্যালেক্সমিসিমিলান বলেছেন অজটা টাইপ.গেটপ্রপার্টি (নাম)! = মাতাসভিটকেভিচিয়াসের মন্তব্যের জবাব আসলেই বাতিল।
সের্গেই

15

আপনি যদি সেটিংসের অবজেক্ট তৈরি / পাসিং নিয়ন্ত্রণ করতে পারেন তবে আমি পরিবর্তে একটি ExpandoObject ব্যবহার করার পরামর্শ দেব।

dynamic settings = new ExpandoObject();
settings.Filename = "asdf.txt";
settings.Size = 10;
...

function void Settings(dynamic settings)
{
    if ( ((IDictionary<string, object>)settings).ContainsKey("Filename") )
        .... do something ....
}

আমি এটি পরিবর্তন করতে পারি না, আমি কী এক্সপেন্ডোঅবজেক্টে কাস্ট করতে পারি?
ডেভিড এমজেড

6

বেনামী ধরনের, এই কাজ ExpandoObject, Nancy.DynamicDictionaryবা অন্য কিছু যে কাস্ট করা যেতে পারে IDictionary<string, object>

    public static bool PropertyExists(dynamic obj, string name) {
        if (obj == null) return false;
        if (obj is IDictionary<string, object> dict) {
            return dict.ContainsKey(name);
        }
        return obj.GetType().GetProperty(name) != null;
    }

2
দুর্দান্ত সমাধান। জেএসএন স্ট্রিংটিকে জোবজেক্টে রূপান্তর করার সময় আমার আরও একটি আইএফ বিবরণ যুক্ত করার দরকার ছিল .... "যদি (আপত্তি নিউটোনসফট।জসন.লিনক.জোবজেক্ট) রিটার্ন ((নিউটোনসফট.জসন.লিনক.জোবজেক্ট) আপত্তি)। কনটেনসকে (নাম)); "
rr789

আমার জন্যও কাজ করেছেন। দুর্দান্ত উত্তর শেঠ রেনো। আমি যুক্তও করেছি "যদি (ওজেক্ট নিউটোনসফট। জসন.লিনক.জোবজেক্ট) রিটার্ন ((নিউটনসফট.জসন.লিনক.জোবজেক্ট) আপত্তি)। কনটেনসকে (নাম);" উপরের ফাংশন হিসাবে rr789 দ্বারা প্রস্তাবিত। সুতরাং দয়া করে এটি অন্তর্ভুক্ত করার জন্য আপনার উত্তরটি সম্পাদনা করুন।
ব্রিজেশ কুমার ত্রিপাঠি

4

এটি আমার জন্য কাজ করছে-:

  public static bool IsPropertyExist(dynamic dynamicObj, string property)
       {
           try
           {
               var value=dynamicObj[property].Value;
               return true;
           }
           catch (RuntimeBinderException)
           {

               return false;
           }

       }

13
ব্যতিক্রম ঘটতে দেওয়া এবং তারপরে তাদের ধরা কোনও পছন্দসই সমাধান নয় কারণ নিক্ষেপ এবং ধরা দেওয়ার সাথে প্রচুর ওভারহেড যুক্ত রয়েছে। এটি কেবলমাত্র একটি শেষ অবলম্বন। ব্যতিক্রম জন্য পরিস্থিতিতে জন্য ডিজাইন করা হয় উচিত মত একটি নেটওয়ার্ক অনুপলব্ধ হচ্ছে মৃত্যুদন্ড অবশ্যই ঘটবে না। এখানে আরও অনেক ভাল সমাধান রয়েছে।
যাই হোক না কেন ম্যান

সঙ্গে ব্যর্থ RuntimeBinderExceptionএবং dynamicObj[property].Value যখন মান আসলে আছে ... var value = dynamicObj[property]যথেষ্ট ... আর যখন এটি বিদ্যমান নয় KeyNotFoundException উপর Dictionaryনিক্ষিপ্ত হয় ... নিচে দেখুন ...
Matas Vaitkevicius

ব্যবসায়িক যুক্তিতে ব্যতিক্রমগুলি গ্রহণ করার জন্য এটি গ্রহণযোগ্য সমাধান নয়। 1 গ্রেড, 2 য় মেয়াদ।
আর্টেম জি

3

এর জন্য উপরে কাজ করা সমাধানগুলির কোনওটিই dynamicআসে না Json, তবে আমি Try catch(@ ব্যবহারকারী3359453 দ্বারা) নিক্ষিপ্ত ব্যতিক্রম প্রকারের KeyNotFoundExceptionপরিবর্তে ( পরিবর্তে RuntimeBinderException) এমন কিছুতে রূপান্তর করতে সক্ষম হয়েছি যা আসলে কাজ করে ...

public static bool HasProperty(dynamic obj, string name)
    {
        try
        {
            var value = obj[name];
            return true;
        }
        catch (KeyNotFoundException)
        {
            return false;
        }
    }

এখানে চিত্র বর্ণনা লিখুন

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


1
এই জাতীয় জিনিসগুলির জন্য ব্যতিক্রম ব্যবহার করার পরামর্শ দেওয়া হয় না। জোবজেক্টে কাস্টিং এবং ব্যবহার করার মতো কিছু করা উচিত ছিল ropপ্রপার্টি ()! = নাল
গ্যাসপা79

3

সেরজ-টিএম এবং ব্যবহারকারীর কাছ থেকে উত্তরগুলি মার্জ করে এবং ঠিক করা 3359453 যাতে এটি ExpandoObject এবং ডায়নামিকজেসনঅজেক্ট উভয়ের সাথে কাজ করে। এটি আমার পক্ষে কাজ করে।

public static bool HasPropertyExist(dynamic settings, string name)
{
    if (settings is System.Dynamic.ExpandoObject)
        return ((IDictionary<string, object>)settings).ContainsKey(name);

    if (settings is System.Web.Helpers.DynamicJsonObject)
    try
    {
        return settings[name] != null;
    }
    catch (KeyNotFoundException)
    {
        return false;
    }


    return settings.GetType().GetProperty(name) != null;
}

2

প্রতিবিম্ব ব্যবহার করে, এটি আমি ব্যবহৃত ফাংশন:

public static bool doesPropertyExist(dynamic obj, string property)
{
    return ((Type)obj.GetType()).GetProperties().Where(p => p.Name.Equals(property)).Any();
}

তারপর ..

if (doesPropertyExist(myDynamicObject, "myProperty")){
    // ...
}

1
গেটপ্রেটিস () ডায়নামিকবজেক্টে গতিশীল সদস্যের তালিকা করে না। তার জন্য একটি ডেডিকেটেড ফাংশন গেটডাইনামিকমেমবারনাম () রয়েছে।
মার্কো গিগনার্ড

Whereপ্রথমে ল্যাম্বডা এক্সপ্রেশনটি ব্যবহার করা এবং তারপরে Anyরিডানডান্ট হিসাবে আপনি নিজের ফিল্টারিং এক্সপ্রেশনটি ভিতরে তৈরি করতে পারেনAny
pholpar

1

যদি কোনও জেসন থেকে কোনও গতিশীল অবজেক্ট হ্যান্ডেল করার প্রয়োজন হয় তবে আমি নিউটনসফট.জসন.জেবজেট থেকে ডেসায়িকাল গতিশীল অবজেক্টটি পরিচালনা করতে শেঠ রেনো উত্তরটি পরিবর্তন করেছি।

public static bool PropertyExists(dynamic obj, string name)
    {
        if (obj == null) return false;
        if (obj is ExpandoObject)
            return ((IDictionary<string, object>)obj).ContainsKey(name);
        if (obj is IDictionary<string, object> dict1)
            return dict1.ContainsKey(name);
        if (obj is IDictionary<string, JToken> dict2)
            return dict2.ContainsKey(name);
        return obj.GetType().GetProperty(name) != null;
    }

0

@ কুরোর থেকে উত্তরটি প্রসারিত করতে, সম্পত্তি খালি কিনা তা পরীক্ষা করার প্রয়োজন হলে নীচে কাজ করা উচিত।

public static bool PropertyExistsAndIsNotNull(dynamic obj, string name)
{
    if (obj == null) return false;
    if (obj is ExpandoObject)
    {
        if (((IDictionary<string, object>)obj).ContainsKey(name))
            return ((IDictionary<string, object>)obj)[name] != null;
        return false;
    }
    if (obj is IDictionary<string, object> dict1)
    {
        if (dict1.ContainsKey(name))
            return dict1[name] != null;
        return false;
    }
    if (obj is IDictionary<string, JToken> dict2)
    {
        if (dict2.ContainsKey(name))
            return (dict2[name].Type != JTokenType.Null && dict2[name].Type != JTokenType.Undefined);
        return false;
    }
    if (obj.GetType().GetProperty(name) != null)
        return obj.GetType().GetProperty(name).GetValue(obj) != null;
    return false;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.