আমি কীভাবে কোনও পদ্ধতির রিটার্ন টাইপ করব?


166

এই পদ্ধতিটি জেনেরিক করার কোনও উপায় আছে যাতে আমি কোনও স্ট্রিং, বুল, ইনট বা ডাবল ফিরিয়ে আনতে পারি? এখনই, এটি একটি স্ট্রিং ফিরিয়ে দিচ্ছে, তবে এটি কনফিগারেশন মান হিসাবে "সত্য" বা "মিথ্যা" সন্ধান করতে পারলে আমি উদাহরণস্বরূপ একটি বুল ফিরিয়ে দিতে চাই।

    public static string ConfigSetting(string settingName)
    {  
         return ConfigurationManager.AppSettings[settingName];
    }

প্রতিটি সেটিংস কী ধরণের তা জানার জন্য কি কোনও উপায় আছে?
thecoshman

2
আমি মনে করি আপনি যে প্রশ্নটি জিজ্ঞাসা করতে চান তা হ'ল "আমি কীভাবে আমার অ্যাপ্লিকেশন কনফিগারেশনটি দৃ strongly়-টাইপ করব?" যদিও আমি একটি সঠিক উত্তর লেখার জন্য এটির সাথে কাজ করেছি অনেক দীর্ঘ হয়েছে।
সাইমন

ইয়াহ, আদর্শভাবে আমি পদ্ধতিতে টাইপটি পাস করতে চাই না। আমি কেবলমাত্র উল্লেখ করেছি 4 টি ধরণের। সুতরাং যদি "সত্য" / "মিথ্যা" সেট করা থাকে তবে আমি এই ফাংশনটি বুলিয়ান ফিরিয়ে আনতে চাই (এটি পদ্ধতিতে পাস করার প্রয়োজন ছাড়াই), আমি সম্ভবত ইন্ট এবং ডাবলকে কেবল ডাবল করে একত্রিত করতে পারি, এবং সমস্ত কিছু একটি স্ট্রিং হওয়া উচিত। ইতিমধ্যে যা জবাব দেওয়া হয়েছে তা ভাল কাজ করবে, তবে আমার প্রতিবার টাইপটি পাস করতে হবে যা সম্ভবত ঠিক আছে।
ম্যাকগাইভার 21'12

3
আপনার মন্তব্যে মনে হচ্ছে আপনি এমন একটি পদ্ধতির জন্য জিজ্ঞাসা করছেন যা সেটিংস নাম কীটির জন্য প্রাপ্ত প্রকৃত ডেটার উপর ভিত্তি করে রানটাইমে দৃ strongly়-টাইপযুক্ত বুল (বা স্ট্রিং, বা ইন্ট, বা আপনার কী আছে) ফেরত দেবে । সি # আপনার পক্ষে তা করবে না; সংকলনের সময় সেই মানটির ধরণটি জানার কোনও উপায় নেই। অন্য কথায়, এটি গতিশীল টাইপিং, স্থির টাইপিং নয়। আপনি dynamicকীওয়ার্ডটি ব্যবহার করলে সি # এটি করতে পারে । এর জন্য একটি পারফরম্যান্স ব্যয় রয়েছে, তবে একটি কনফিগার ফাইল পড়ার জন্য, পারফরম্যান্স ব্যয়টি প্রায় অবশ্যই তুচ্ছ।
ফুগ

উত্তর:


354

আপনার এটিকে একটি জেনেরিক পদ্ধতি তৈরি করতে হবে:

public static T ConfigSetting<T>(string settingName)
{  
    return /* code to convert the setting to T... */
}

কিন্তু কলকারীকে তাদের যে ধরণের প্রত্যাশা রয়েছে তা উল্লেখ করতে হবে। আপনি তখন Convert.ChangeTypeপ্রাসঙ্গিকভাবে সমস্ত প্রকারের সমর্থনযোগ্য তা ধরে নিয়ে ব্যবহার করতে পারেন :

public static T ConfigSetting<T>(string settingName)
{  
    object value = ConfigurationManager.AppSettings[settingName];
    return (T) Convert.ChangeType(value, typeof(T));
}

আমি পুরোপুরি নিশ্চিত নই যে এগুলি একটি ভাল ধারণা, মনে রাখবেন ...


21
/ * কোডটি সেটিংসটিকে টিতে রূপান্তর করতে ... * / এবং এখানে পুরো উপন্যাসটি অনুসরণ করেছে :)
অ্যাড্রিয়ান ইফটোড

1
এটির জন্য আপনি যে সেটিংটি পেতে চান সেটি কীভাবে জানা দরকার তা সম্ভবত নাও হতে পারে।
thecoshman

2
@ থেকোশম্যান: এটি হবে তবে আপনি যদি তা না করেন তবে ফেরত মূল্য দিয়ে আপনি কী করবেন?
জর্জি ডেকেট

5
এই উত্তরটি অবশ্যই সঠিক হয়, এবং হিসাবে আপনি সন্তুষ্ট নোট ওপি অনুরোধ, তাহলে সম্ভবত মূল্য উল্লেখ করার এর পৃথক পদ্ধতি (পুরোনো পদ্ধতির যে ConfigSettingString, ConfigSettingBoolপরিষ্কার, ইত্যাদি) পদ্ধতি সংস্থা সুবিধা হলো খাটো হতে হবে আছে,, এবং আরও ভাল দৃষ্টি নিবদ্ধ করা ।
ফুগ

4
যদি এটি প্রস্তাবিত না হয় তবে জেনেরিক রিটার্নের ধরণের উদ্দেশ্য কী?
বোবিলেেক্স

29

আপনি ব্যবহার করতে পারেন Convert.ChangeType():

public static T ConfigSetting<T>(string settingName)
{
    return (T)Convert.ChangeType(ConfigurationManager.AppSettings[settingName], typeof(T));
}

13

এটি করার অনেকগুলি উপায় রয়েছে (অগ্রাধিকার অনুসারে তালিকাভুক্ত, ওপি-র সমস্যার ক্ষেত্রে নির্দিষ্ট)

  1. বিকল্প 1: সরল পদ্ধতির - প্রতিটি জেনেরিক ফাংশন না করে আপনি যে ধরণের প্রত্যাশা করেন তার জন্য একাধিক ফাংশন তৈরি করুন।

    public static bool ConfigSettingInt(string settingName)
    {  
         return Convert.ToBoolean(ConfigurationManager.AppSettings[settingName]);
    }
  2. বিকল্প 2: আপনি যখন রূপান্তরকরণের অভিনব পদ্ধতি ব্যবহার করতে চান না - বস্তুর জন্য মান এবং তারপরে জেনেরিক টাইপ করুন।

    public static T ConfigSetting<T>(string settingName)
    {  
         return (T)(object)ConfigurationManager.AppSettings[settingName];
    }

    দ্রষ্টব্য - theালাই বৈধ না হলে এটি একটি ত্রুটি ফেলবে (আপনার ক্ষেত্রে)। আপনি টাইপ কাস্টিং সম্পর্কে নিশ্চিত না হলে আমি এটি করার পরামর্শ দেব না, বিকল্প 3 এর জন্য যান।

  3. বিকল্প 3: প্রকার সুরক্ষা সহ জেনেরিক - ধরণের রূপান্তর পরিচালনা করতে জেনেরিক ফাংশন তৈরি করুন।

    public static T ConvertValue<T,U>(U value) where U : IConvertible
    {
        return (T)Convert.ChangeType(value, typeof(T));
    } 

    দ্রষ্টব্য - টি প্রত্যাশিত প্রকার, এখানে প্রতিবন্ধকতাটি নোট করুন (ত্রুটি থেকে আমাদের বাঁচাতে ইউ এর ধরণটি আইকনভার্টেবল হতে হবে)


4
তৃতীয় বিকল্পটি জেনেরিক কেন তৈরি করবেন U? এটি করার কোনও অর্থ নেই, এবং এটি কলটি করা পদ্ধতিটিকে আরও শক্ত করে তোলে। IConvertibleপরিবর্তে গ্রহণ করুন। আমি মনে করি না যে এটি জিজ্ঞাসা করা প্রশ্নের উত্তর দেয় না এই প্রশ্নটির জন্য দ্বিতীয় বিকল্প সহ এটি মূল্যবান। আপনার সম্ভবত প্রথম বিকল্পটিতে পদ্ধতিটির পুনরায় নামকরণ করা উচিত ...
জন স্কিটি

7

কল করার সময় আপনার পদ্ধতির ফেরতের মূল্যের ধরণটিকে জেনেরিক ধরণে রূপান্তর করতে হবে যা আপনি কল করার সময় পদ্ধতিতে পাস করেন।

    public static T values<T>()
    {
        Random random = new Random();
        int number = random.Next(1, 4);
        return (T)Convert.ChangeType(number, typeof(T));
    }

আপনি যে পদ্ধতিটি দিয়ে ফিরে আসবেন তার জন্য আপনার টাইপ জাত হতে হবে pass

আপনি যদি জেনেরিক ধরণের যে জাতটি জাত করে না তেমন কোনও জাতকে ফেরত দিতে চান তবে আপনাকে কোডটি পরিবর্তন করতে হবে বা নিশ্চিত করতে হবে যে আপনি এমন কোনও প্রকারটি পাস করেছেন যা পদ্ধতির ফেরতের মূল্যের জন্য বর্ণনীয়। সুতরাং, এই পদ্ধতির পুনরুদ্ধার করা হয় না।


স্পট অন - আমার জন্য শেষ লাইনটি return (T)Convert.ChangeType(number, typeof(T));হ'ল আমি যা হারিয়েছিলাম - চিয়ার্স
গ্রেগ ট্র্যাভেলিক

1

একটি ফাংশন তৈরি করুন এবং জেনেরিক ধরণের হিসাবে পুরাতন পরামিতিগুলি পাস করুন।

 public static T some_function<T>(T out_put_object /*declare as Output object*/)
    {
        return out_put_object;
    }

এটি কয়েকটি ব্যবহারের ক্ষেত্রে আসলে বেশ স্মার্ট। ডাটাবেস থেকে ডেটা টানানোর মতো। আপনি জানেন যে আপনি টাইপের টি এর ডেটাগুলির একটি তালিকা পাবেন ing লোডিং পদ্ধতিটি এখনই জানেন না যে আপনি এখন কী ধরণের টি চান want সুতরাং এটির জন্য একটি নতুন তালিকা <ওয়ান্টেডঅবজেক্ট> পাস করুন এবং পদ্ধতিটি এটির কাজটি করতে পারে এবং এটি ফেরত দেওয়ার আগে তালিকাটি পূরণ করতে পারে। নিস!
মার্কো হিউম্যান

0

কোড নীচে চেষ্টা করুন:

public T? GetParsedOrDefaultValue<T>(string valueToParse) where T : struct, IComparable
{
 if(string.EmptyOrNull(valueToParse))return null;
  try
  {
     // return parsed value
     return (T) Convert.ChangeType(valueToParse, typeof(T));
  }
  catch(Exception)
  {
   //default as null value
   return null;
  }
 return null;
}

-1
 private static T[] prepareArray<T>(T[] arrayToCopy, T value)
    {
        Array.Copy(arrayToCopy, 1, arrayToCopy, 0, arrayToCopy.Length - 1);
        arrayToCopy[arrayToCopy.Length - 1] = value;
        return (T[])arrayToCopy;
    }

আমি আমার কোড জুড়ে এটি সম্পাদন করছিলাম এবং এটি কোনও পদ্ধতিতে রাখার উপায় চেয়েছিলাম। আমি এখানে এটি ভাগ করে নিতে চেয়েছিলাম কারণ আমাকে আমার ফেরতের মূল্যের জন্য কনভার্ট C চেঞ্জটাইপ ব্যবহার করতে হবে না। এটি সেরা অভ্যাস নাও হতে পারে তবে এটি আমার পক্ষে কাজ করেছিল। এই পদ্ধতিটি জেনেরিক ধরণের একটি অ্যারে এবং অ্যারের শেষে যুক্ত করতে একটি মান গ্রহণ করে। তারপরে অ্যারেটি প্রথম মানটি ছিনিয়ে নিয়ে অনুলিপি করা হয় এবং পদ্ধতিতে নেওয়া মানটি অ্যারের শেষে যুক্ত হয় is শেষ কথাটি হ'ল আমি জেনেরিক অ্যারেটি ফিরিয়ে দিই।

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