জেনেরিক টাইপটি যদি স্ট্রিং হয় তবে পরীক্ষার সর্বোত্তম উপায়? (সি #)


95

আমার একটি জেনেরিক ক্লাস রয়েছে যা কোনও প্রকার, আদিম বা অন্য কোনওভাবে মঞ্জুরি দেয়। এটির সাথে একমাত্র সমস্যাটি ব্যবহার করা default(T)। যখন আপনি কোনও মান প্রকার বা স্ট্রিংয়ে ডিফল্ট কল করেন, তখন এটি একটি যুক্তিসঙ্গত মান হিসাবে শুরু করে (যেমন খালি স্ট্রিং)। আপনি যখন default(T)কোনও বস্তুতে কল করবেন তখন তা শূন্য হয়। বিভিন্ন কারণে আমাদের তা নিশ্চিত করতে হবে যে এটি যদি কোনও আদিম ধরণের না হয়, তবে আমাদের কাছে টাইপের একটি ডিফল্ট উদাহরণ থাকবে, শূন্য নয় । এখানে চেষ্টা 1:

T createDefault()
{
    if(typeof(T).IsValueType)
    {
        return default(T);
    }
    else
    {
        return Activator.CreateInstance<T>();
    }
}

সমস্যা - স্ট্রিং কোনও মান ধরণের নয়, তবে এতে প্যারামিটারলেস কনস্ট্রাক্টর নেই। সুতরাং, বর্তমান সমাধানটি হ'ল:

T createDefault()
{
    if(typeof(T).IsValueType || typeof(T).FullName == "System.String")
    {
        return default(T);
    }
    else
    {
        return Activator.CreateInstance<T>();
    }
}

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

উত্তর:


162

মনে রাখবেন যে ডিফল্ট (স্ট্রিং) নাল, স্ট্রিং নয় mp আপনি আপনার কোডে একটি বিশেষ মামলা চাইতে পারেন:

if (typeof(T) == typeof(String)) return (T)(object)String.Empty;

4
আমি ভেবেছিলাম আমি সমাধানটি আগে চেষ্টা করেছি এবং এটি কার্যকর হয়নি, তবে আমি অবশ্যই বোকামি কিছু করেছি। এবং ডিফল্ট (স্ট্রিং) নালার দিকে নির্দেশ করার জন্য ধন্যবাদ, আমরা এটির কারণে এখনও একটি ত্রুটি হিসাবে চলিনি, তবে এটি সত্য।
রেক্স এম

4
@ ম্যাট হ্যামিল্টন: +১, কিন্তু কোডআইএনচায়োসের পরামর্শ অনুসারে আপনার উত্তর ('টি) (অবজেক্ট) স্ট্রিং.এম্পটি' আপডেট করতে হবে কারণ পদ্ধতিটি রিটার্নের ধরণটি জেনেরিক, আপনি কেবল স্ট্রিং ফিরিয়ে দিতে পারবেন না।
ভুডোচিল্ড

4
isকীওয়ার্ড সম্পর্কে কি ? এখানে কি ব্যবহার হয় না?
নাভেদ বাট

এই মুহূর্তে জেনারিকস এবং অ্যাসাইনমেন্ট বা সরাসরি তাত্ক্ষণিকতা সহ অপারেটরটি প্রয়োগ করা সম্ভব নয়, তাই না, এটি একটি দুর্দান্ত বৈশিষ্ট্য হবে
জুয়ান পাবলো গার্সিয়া কোয়েলো

14
if (typeof(T).IsValueType || typeof(T) == typeof(String))
{
     return default(T);
}
else
{
     return Activator.CreateInstance<T>();
}

অনির্ধারিত, তবে মনে মনে প্রথম বিষয়টি।


4

আপনি টাইপকোড গণনা ব্যবহার করতে পারেন । ক্লাসে গেটটাইপকোড পদ্ধতিটি কল করুন যেগুলি ক্লাসের উদাহরণের জন্য টাইপ কোড পাওয়ার জন্য আইকনভারটিবল ইন্টারফেস প্রয়োগ করে। আইকনভার্টেবল বুলিয়ান, এসবিট, বাইট, ইন্ট 16, ইউআইএনট 16, ইন্ট 32, ইউআইএনটি 32, ইন্ট 64, ইউআইএনটি 64, সিঙ্গল, ডাবল, ডেসিমাল, ডেটটাইম, চর এবং স্ট্রিং দ্বারা প্রয়োগ করা হয়, যাতে আপনি এটি ব্যবহার করে আদিম ধরণের জন্য পরীক্ষা করতে পারেন। " জেনেরিক টাইপ চেকিং " সম্পর্কিত আরও তথ্য ।


2

ব্যক্তিগতভাবে, আমি পদ্ধতি ওভারলোডিং পছন্দ করি:

public static class Extensions { 
  public static String Blank(this String me) {      
    return String.Empty;
  }
  public static T Blank<T>(this T me) {      
    var tot = typeof(T);
    return tot.IsValueType
      ? default(T)
      : (T)Activator.CreateInstance(tot)
      ;
  }
}
class Program {
  static void Main(string[] args) {
    Object o = null;
    String s = null;
    int i = 6;
    Console.WriteLine(o.Blank()); //"System.Object"
    Console.WriteLine(s.Blank()); //""
    Console.WriteLine(i.Blank()); //"0"
    Console.ReadKey();
  }
}

0

আমি জানি এই প্রশ্নটি পুরানো, তবে একটি আপডেট হয়েছে।

যেহেতু সি # 7.0 আপনি isপ্রকারের তুলনা করতে অপারেটরটি ব্যবহার করতে পারেন । typeofস্বীকৃত উত্তরের মতো আপনার আর ব্যবহারের প্রয়োজন নেই ।

        public bool IsObjectString(object obj)
        {
            return obj is string;
        }

https://docs.microsoft.com/en-US/dotnet/csharp/language-references/keywords/is


-6

স্ট্রিংয়ের জন্য আলোচনা এখানে কাজ করছে না।

জেনেরিকদের এটির কাজ করার জন্য আমার নীচের কোড থাকতে হয়েছিল -

   private T createDefault()
    { 

        {     
            if(typeof(T).IsValueType)     
            {         
                return default(T);     
            }
            else if (typeof(T).Name == "String")
            {
                return (T)Convert.ChangeType(String.Empty,typeof(T));
            }
            else
            {
                return Activator.CreateInstance<T>();
            } 
        } 

    }

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