এমন কোনও জেনেরিক পার্স () ফাংশন রয়েছে যা পার্স ব্যবহার করে কোনও স্ট্রিংকে কোনও প্রকারে রূপান্তরিত করে?


91

আমি একটি জেনেরিক ধরনের একটি স্ট্রিং রূপান্তর করতে চান intবা dateবা longজেনেরিক রিটার্ন টাইপ উপর ভিত্তি করে।

মূলত এর মতো একটি ফাংশন Parse<T>(String)টাইপের একটি আইটেম দেয় T

উদাহরণস্বরূপ যদি কোনও int পাস করা হয় তবে ফাংশনটি int.parseঅভ্যন্তরীণভাবে করা উচিত ।

উত্তর:


132

System.Convers.ChangeType

আপনার উদাহরণ অনুসারে, আপনি এটি করতে পারেন:

int i = (int)Convert.ChangeType("123", typeof(int));
DateTime dt = (DateTime)Convert.ChangeType("2009/12/12", typeof(DateTime));

আপনার "জেনেরিক রিটার্ন টাইপের" প্রয়োজনীয়তাটি পূরণ করতে, আপনি নিজের এক্সটেনশন পদ্ধতিটি লিখতে পারেন:

public static T ChangeType<T>(this object obj)
{
    return (T)Convert.ChangeType(obj, typeof(T));
}

এটি আপনাকে করতে দেয়:

int i = "123".ChangeType<int>();

শীতল, তবে আশ্চর্যজনক বিষয়টির নামটি চেঞ্জটাইপ, তাই আমি ভাবতাম যে এই ফাংশনটি কিছু প্রকারের কাস্ট করে এবং পার্স করে না
করিম

7
এমএসডিএন বলছে এটি কেবল একটি মোড়ক যা উত্স অবজেক্টে সঠিক রূপান্তর পদ্ধতিটি সন্ধান করে, এটি আইকনভারটিবেল ইন্টারফেস প্রয়োগ করে তা প্রয়োজনীয় করে।
অনি

যদি এটি বাস্তবায়নের প্রয়োজন হয় তবে আপনিও IConvertableবাধা প্রদান করবেন না T, মানে T ChangeType<T>(this object obj) where T : IConvertable?
লিয়াম

4
@ লিয়াম: না, এটি objঅবশ্যই হওয়া উচিত IConvertibleতবে সংকলন-সময় এটি নির্দিষ্ট করার কোনও উপায় নেই।
আনি

আমার যদি ট্রাইচেনজিটাইপের মতো এমন কিছু দরকার যা ব্যর্থতার ক্ষেত্রে বাতিল বা মিথ্যা দেয়? কেবল ব্যতিক্রম ধরা?
নিরাশ

22

দেখে মনে হচ্ছে এই থ্রেডে জবাব দেওয়ার জন্য আমি অনেক দেরি করেছি। তবে এখানে আমার বাস্তবায়ন:

মূলত, আমি অবজেক্ট ক্লাসের জন্য একটি এক্সটেনশন পদ্ধতি তৈরি করেছি। এটি সমস্ত ধরণের হ'ল পরিচালনা করে, অর্থাত্ nlalable, শ্রেণী এবং কাঠামো।

 public static T ConvertTo<T>(this object value)
           {
               T returnValue;

               if (value is T variable)
                   returnValue = variable;
               else
                   try
                   {
                       //Handling Nullable types i.e, int?, double?, bool? .. etc
                       if (Nullable.GetUnderlyingType(typeof(T)) != null)
                       {
                           TypeConverter conv = TypeDescriptor.GetConverter(typeof(T));
                           returnValue = (T) conv.ConvertFrom(value);
                       }
                       else
                       {
                           returnValue = (T) Convert.ChangeType(value, typeof(T));
                       }
                   }
                   catch (Exception)
                   {
                       returnValue = default(T);
                   }

               return returnValue;
           }

আইএমএইচও এটিই উত্তম উত্তরের কারণ এটিতে "নাল"
ওলে অ্যালবার্স

আপনি যে কারণে TypeDescriptorক্ষয়যোগ্য প্রকারের Convert.ChangeTypeজন্য এবং নন-অযোগ্যদের জন্য ব্যবহার করছেন তার কোনও নির্দিষ্ট কারণ আছে ? এই পুরো tryব্লকটি কেবল TypeConverterকোডের 2 লাইনের মধ্যে হ্রাস করা যেতে পারে এবং এটি উভয় ক্ষেত্রেই কার্যকর এবং নন-অযোগ্য work
ইমুজাগিক


8

প্রনয়ের উত্তরের ক্লিনার সংস্করণ

public static T ConvertTo<T>(this object value)
{
    if (value is T variable) return variable;

    try
    {
        //Handling Nullable types i.e, int?, double?, bool? .. etc
        if (Nullable.GetUnderlyingType(typeof(T)) != null)
        {
            return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFrom(value);
        }

        return (T)Convert.ChangeType(value, typeof(T));
    }
    catch (Exception)
    {
        return default(T);
    }
}

0

.NET- এ বেশ কয়েকটি কনভেনশন রয়েছে যা এক ধরণের অবজেক্টকে অন্য ধরণের রূপান্তর করতে পারে।

তবে এই পদ্ধতিগুলি আপনার সাধারণের তুলনায় অনেক ধীরে ধীরে T.Parse(string), বক্সিংয়ের কারণ দেয় এবং প্রতিবার আপনি যখন কোনও একক মান রূপান্তর করতে চান তখন প্রচুর পরিমাণে বরাদ্দ জড়িত।

জন্য ValueString , আমি টাইপ প্রতিফলন ব্যবহারের উপযুক্ত স্ট্যাটিক পার্সিং পদ্ধতি খুঁজে, একটি ল্যামডা অভিব্যক্তি এটা আহ্বান নির্মাণ ও ভবিষ্যতে ব্যবহারের জন্য কম্পাইল প্রতিনিধি (দেখুন ক্যাশে করতে এই উত্তরটি একটি উদাহরণ জন্য)।

টাইপটির উপযুক্ত পার্সিং পদ্ধতি না থাকলে ( রেডমে পারফরম্যান্স বিভাগটি দেখুন ) যদি আমি উপরে উল্লিখিত পদ্ধতিগুলির ফলব্যাক করে ।

var v = new ValueString("15"); // struct
var i = v.As<int>(); // Calls int.Parse.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.