কোনও অ্যাপসেটিং কী উপস্থিত আছে কিনা তা কীভাবে পরীক্ষা করবেন?


146

অ্যাপ্লিকেশন সেটিং পাওয়া যায় কিনা তা আমি কীভাবে চেক করব?

অর্থাত্ app.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key ="someKey" value="someValue"/>
  </appSettings>
</configuration>

এবং কোডফাইলে

if (ConfigurationManager.AppSettings.ContainsKey("someKey"))
{
  // Do Something
}else{
  // Do Something Else
}

উত্তর:


223

এমএসডিএন: কনফিগারেশন ম্যানেজার। অ্যাপসেটেটিং

if (ConfigurationManager.AppSettings[name] != null)
{
// Now do your magic..
}

অথবা

string s = ConfigurationManager.AppSettings["myKey"];
if (!String.IsNullOrEmpty(s))
{
    // Key exists
}
else
{
    // Key doesn't exist
}

2
আমাদের লাইব্রেরিতে একটি এসকিউএল-এর মতো ইসনুল ফাংশন রয়েছে যা একটি সেটিংস পুনরুদ্ধারকে খুব সহজ করে তোলে:Dim configValue As String = Util.IsNull(ConfigurationManager.AppSettings.Get("SettingName"), String.Empty)
এরিক এইচ

10
এটি "অবজেক্টের রেফারেন্স কোনও জিনিসের উদাহরণ হিসাবে সেট করা হয়নি" ছুড়ে
ওয়াকার আলমগীর

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

যদি আপনি ইসনুলআরএম্পটির জন্য পরীক্ষা করেন তবে আপনার কীটি "কী বিদ্যমান নেই" র জন্য যুক্তিটি চলবে যখন আপনার কাছে একটি বৈধ সেটিং হিসাবে ফাঁকা স্ট্রিং মান সহকারে একটি কী থাকবে
নরজহ্নস্টোন

3
ব্যতিক্রম ছোঁড়া হিসাবে সেরা উত্তর না। দিব্যেশ প্যাটেল আরও ভাল সমাধান।
ভিআরপিএফ

81
if (ConfigurationManager.AppSettings.AllKeys.Contains("myKey"))
{
    // Key exists
}
else
{
    // Key doesn't exist
}

এটি সম্ভবত সামান্য আরও কার্যকর (?) হতে পারে যদি আপনার পরে মানটি ব্যবহার করার ইচ্ছা না থাকে। প্রশ্নটিতে বিশেষত টেস্টিংয়ের উল্লেখ রয়েছে 'যদি অ্যাপ্লিকেশন সেটিং পাওয়া যায়'। যেহেতু উপলভ্যতা এটি আমার মনে এটি ব্যবহার করার আকাঙ্ক্ষাকে বোঝায়, তাই আমি বলব যে ব্যবহারকারীর দ্বারা সরবরাহিত উত্তর ১৯৫৪৮৮ এখানে আসার লোকদের পক্ষে আরও কার্যকর হবে - তবে কড়া কথায় বলতে গেলে আপনার উত্তরটিও সঠিক।
কোড জকি

10
এটি আসলে কীটির উপস্থিতি আছে কিনা তা যাচাই করে নেওয়া যায় তার পক্ষে এটি আরও সহজ সমাধান। যদি আমার চাবির জন্য আমার কাছে ফাঁকা মূল্য থাকে তবে ব্যবহারিক 195488 এর প্রদত্ত সমাধান আমাকে একটি মিথ্যা ধনাত্মক দেবে।
ডিসাইলিকানাবোকো

6
এই সমাধানটি ভুল। অ্যাপসেটেটিংগুলি হ'ল নেমভ্যালু সংগ্রহ যা মূল অনুসন্ধানের ক্ষেত্রে ডিফল্টরূপে কেস-সংবেদনশীল । লিনকুই। আপনি এখানে ব্যবহার করছেন এক্সটেনশন পদ্ধতিটি তবে কেস-সংবেদনশীল তুলনায় ডিফল্ট হবে ।
জ্যাক্স

9

জেনেরিকস এবং লিনকিউ এর মাধ্যমে নিরাপদে ডিফল্ট মানটি ফিরিয়ে দিয়েছে।

public T ReadAppSetting<T>(string searchKey, T defaultValue, StringComparison compare = StringComparison.Ordinal)
{
    if (ConfigurationManager.AppSettings.AllKeys.Any(key => string.Compare(key, searchKey, compare) == 0)) {
        try
        { // see if it can be converted.
            var converter = TypeDescriptor.GetConverter(typeof(T));
            if (converter != null) defaultValue = (T)converter.ConvertFromString(ConfigurationManager.AppSettings.GetValues(searchKey).First());
        }
        catch { } // nothing to do just return the defaultValue
    }
    return defaultValue;
}

নিম্নলিখিত হিসাবে ব্যবহৃত:

string LogFileName = ReadAppSetting("LogFile","LogFile");
double DefaultWidth = ReadAppSetting("Width",1280.0);
double DefaultHeight = ReadAppSetting("Height",1024.0);
Color DefaultColor = ReadAppSetting("Color",Colors.Black);

ConfigurationManager.AppSettingsAny(key => key == MyKeyতবে এটি সংবেদনশীল নয়
janv8000

@ janv8000 আমি কেস সংবেদনশীলতা চেয়েছিলাম, তবে এটি পরিচালনা করতে উদাহরণ আপডেট করেছি।
কোডবেণ্ডার

যথাযথ কেস-অবশ তুলনা দ্রুত toupper (দেখুন সঙ্গে আছে stackoverflow.com/a/12137/389424 )। এমনকি বিটারটি স্ট্রিং ব্যবহার করতে হয় quএক্কালস () ওভারলোড একটি স্ট্রিংকোপারশন টাইপ পাস করে।
janv8000

এটি ইস্যুটির সত্যই দুর্দান্ত সমাধান। প্রয়োজনীয় সেটিংসের ধারণাকে সমর্থন করার জন্য আমি বাস্তবায়নটি কিছুটা পরিবর্তন করেছি। কেবল একটি জিনিস - using System.ComponentModel;ক্লাসের ব্যবহারকে সমর্থন করার জন্য আপনার ক্লাসে বিবৃতি যুক্ত করতে ভুলবেন না TypeDescriptor
এসটিএলডিভ


2

আপনি যে কীটি সন্ধান করছেন সেটি যদি কনফিগার ফাইলটিতে উপস্থিত না থাকে তবে আপনি এটিকে .ToString () দিয়ে একটি স্ট্রিংয়ে রূপান্তর করতে সক্ষম হবেন না কারণ মানটি নাল হবে এবং আপনি "অবজেক্ট রেফারেন্স সেট না করে পেয়ে যাবেন" একটি বস্তুর উদাহরণে "ত্রুটি। স্ট্রিং প্রতিনিধিত্ব করার চেষ্টা করার আগে মানটি বিদ্যমান কিনা তা আগে দেখা ভাল।

if (!String.IsNullOrEmpty(ConfigurationManager.AppSettings["myKey"]))
{
    String myKey = ConfigurationManager.AppSettings["myKey"].ToString();
}

বা কোড বানরের পরামর্শ অনুসারে:

if (ConfigurationSettings.AppSettings["myKey"] != null)
{
// Now do your magic..
}

2

উচ্চ বিকল্পগুলি সমস্ত উপায়ে নমনীয় দেয়, যদি আপনি কী টাইপগুলি জানেন তবে সেগুলি পার্স করার চেষ্টা করুন bool.TryParse(ConfigurationManager.AppSettings["myKey"], out myvariable);


2

আমি মনে করি লিনকিউ এক্সপ্রেশনটি সেরা হতে পারে:

   const string MyKey = "myKey"

   if (ConfigurationManager.AppSettings.AllKeys.Any(key => key == MyKey))
          {
              // Key exists
          }

অবশ্যই ... তবে ইদুনো - এই পদ্ধতির কোনও সুবিধা আছে কি? যদি আমি লিন্কে সত্যই পারদর্শী (যা বেশিরভাগ সি # প্রোগ্রামার সম্ভবত অবশেষে আসবে), তবে সম্ভবত এই উদাহরণটি পড়া খুব সহজ হবে তবে আমি মনে করি না যে এটি কখনও সহজ হবে - যদি না দক্ষতার সুবিধা না হয় ... কেন?
কোড জকি

কোনও দক্ষতার সুবিধা এবং সিনট্যাক্টিকভাবে ভার্বোজ ইমো নেই।
জন নিকোলাস

1
ConfigurationManager.AppSettingsAny(key => key == MyKeyতবে এটি সংবেদনশীল নয়
janv8000

1

আমি কোডবেন্ডারের উত্তর পছন্দ করেছি , তবে এটি সি ++ / সিএলআইতে কাজ করার প্রয়োজন ছিল। এটিই আমি শেষ করেছি। এখানে লিনকুইয়ের ব্যবহার নেই, তবে কাজ করে।

generic <typename T> T MyClass::ReadAppSetting(String^ searchKey, T defaultValue) {
  for each (String^ setting in ConfigurationManager::AppSettings->AllKeys) {
    if (setting->Equals(searchKey)) { //  if the key is in the app.config
      try {                           // see if it can be converted
        auto converter = TypeDescriptor::GetConverter((Type^)(T::typeid)); 
        if (converter != nullptr) { return (T)converter->ConvertFromString(ConfigurationManager::AppSettings[searchKey]); }
      } catch (Exception^ ex) {} // nothing to do
    }
  }
  return defaultValue;
}

0

ট্রাই পার্সির সাথে নতুন সি # সিনট্যাক্স ব্যবহার করা আমার পক্ষে ভাল কাজ করেছে:

  // TimeOut
  if (int.TryParse(ConfigurationManager.AppSettings["timeOut"], out int timeOut))
  {
     this.timeOut = timeOut;
  }

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