জেনেরিক ধরণের রূপান্তর FROM স্ট্রিং


234

আমার একটি ক্লাস রয়েছে যা আমি অন্য শ্রেণীর জন্য "বৈশিষ্ট্য" সঞ্চয় করতে ব্যবহার করতে চাই। এই বৈশিষ্ট্যগুলির কেবল একটি নাম এবং একটি মান রয়েছে। আদর্শভাবে, আমি যা চাই তা হ'ল টাইপ করা বৈশিষ্ট্য যুক্ত করতে পারা , যাতে "মান" প্রত্যাবর্তন হয় তা সর্বদা আমি যে ধরণের চাই তা চাই।

ধরণটি সর্বদা একটি আদিম হওয়া উচিত। এই শ্রেণিটি একটি বিমূর্ত শ্রেণি সাবক্লাস করে যা মূলত স্ট্রিং হিসাবে নাম এবং মান সংরক্ষণ করে। এই সাবক্লাসটি বেস শ্রেণিতে কিছু প্রকারের সুরক্ষা যোগ করবে (সেইসাথে কিছু রূপান্তরে আমাকে সংরক্ষণও করবে) ধারণাটি।

সুতরাং, আমি একটি ক্লাস তৈরি করেছি যা এটি (মোটামুটি) এটি:

public class TypedProperty<DataType> : Property
{
    public DataType TypedValue
    {
        get { // Having problems here! }
        set { base.Value = value.ToString();}
    }
}

সুতরাং প্রশ্নটি হ'ল:

স্ট্রিং থেকে আবার কোনও আদিমে রূপান্তর করার কোনও "জেনেরিক" উপায় আছে কি?

আমি কোনও জেনেরিক ইন্টারফেসের সন্ধান করতে পারছি না যা বোর্ড জুড়ে রূপান্তরকে সংযুক্ত করে ( ITryParsable এর মতো কিছু আদর্শ হতে পারে!)।


আমি আপনার কংক্রিট বর্গের উদাহরণ, এমনকি একটি স্নিপেট দেখতে আগ্রহী। :)
জন লিমাজাপ

আপনি কি আপনার বেস ক্লাসের প্রাসঙ্গিক অংশ পোস্ট করতে পারেন?
জেজেএস

আমি ভাবছি যে কেউ এখানে কাজ করে উত্তর পেতে পারে কিনা। নেট স্ট্যান্ডার্ড 1.2: /
ড্যান রেইসন

উত্তর:


374

আমি আপনার উদ্দেশ্যগুলি সঠিকভাবে বুঝতে পেরেছি কিনা তা সম্পর্কে আমি নিশ্চিত নই, তবে আসুন আমরা দেখে নিই যে এটি কোনও সাহায্য করে কিনা।

public class TypedProperty<T> : Property where T : IConvertible
{
    public T TypedValue
    {
        get { return (T)Convert.ChangeType(base.Value, typeof(T)); }
        set { base.Value = value.ToString();}
    }
}

আমি কয়েকদিন ধরেই ভাবছিলাম যে কীভাবে জেনেরিক ধরণের কোনও স্ট্রিমের deserialize করা যায়। ধন্যবাদ :)
ট্র্যাপ

3
আমি একমত, যদিও Convert.ChangeTypeএটি খুব সার্বজনীন এবং এক্সটেনসিবল সমাধান নয় তবে এটি বেশিরভাগ মৌলিক ধরণের জন্য কাজ করে। যদি আরও ভাল কিছু প্রয়োজন হয় তবে টিম যেমন পরামর্শ দিয়েছিল বা পুরোপুরি ভিন্ন রূপান্তর পদ্ধতি ব্যবহার করে সেভাবে এই পদ্ধতিটিকে আরও বড় কিছুতে গুটিয়ে ফেলাতে সমস্যা নেই।
lubos hasko

18
আমি অবশ্যই সেখানে যুক্ত করব টি: আইকনভার্টেবল
মাইকটি

5
প্রকার টি আইকনভার্টেবল না হওয়া উচিত, তবে বেসের ধরণ V মূল্য উচিত।
চ্যাপলাক

74

লুবস হাসকের পদ্ধতিটি নালাগুলির জন্য ব্যর্থ হয়। নীচের পদ্ধতিটি নালাগুলির জন্য কাজ করবে। যদিও আমি এটি নিয়ে আসিনি। আমি এটি গুগলের মাধ্যমে খুঁজে পেয়েছি: http://web.archive.org/web/20101214042641/http://dogaoztuzun.com/post/C- জেনেরিক- টাইপ- রূপান্তর.এএসপিএক্স "টুনা টোকসোজ" এর ক্রেডিট

প্রথমে ব্যবহার:

TConverter.ChangeType<T>(StringValue);  

ক্লাসটি নীচে রয়েছে।

public static class TConverter
{
    public static T ChangeType<T>(object value)
    {
        return (T)ChangeType(typeof(T), value);
    }

    public static object ChangeType(Type t, object value)
    {
        TypeConverter tc = TypeDescriptor.GetConverter(t);
        return tc.ConvertFrom(value);
    }

    public static void RegisterTypeConverter<T, TC>() where TC : TypeConverter
    {

        TypeDescriptor.AddAttributes(typeof(T), new TypeConverterAttribute(typeof(TC)));
    }
}

আমি এনামস এবং অন্যান্য কমপ্লেক্স স্ট্রাকচারের জন্য একটি ফ্যালব্যাক রূপান্তর বিকল্পগুলি যুক্ত করব তবে ভাল কল।
টোমর ডব্লিউ

2
কেন রেজিস্টারটাইপ কনভার্টার? আমাদের কি হাতের আগে রূপান্তরকারীদের নিবন্ধকরণ করতে হবে? (দুর্ভাগ্যক্রমে লিঙ্কটি মারা গেছে, তাই আমি এটি পড়তে পারি না)
কোহেন

একাধিক রূপান্তরগুলির জন্য আপনার সম্ভবত একবার tc(একবার TypeConverter) তৈরি করা উচিত । TypeConverterধীর কারণ এটি অনুসন্ধানের জন্য প্রতিবিম্ব ব্যবহার করে TypeConverterAttribute। আপনি যদি একটি একক ব্যক্তিগত TypeConverterক্ষেত্র আরম্ভ করেন , তবে আপনাকে TypeConverterবহুবার পুনরায় ব্যবহার করতে সক্ষম হওয়া উচিত ।
কেভিন পি। রাইস

সূক্ষ্মভাবে কাজ করে, তবে টি যদি হয় তবে objectএকটি ব্যতিক্রম ছুঁড়ে। আমি work if (typof (T) .IsPrimitive) - TConverter.ChangeType <T> (স্ট্রিংভ্যালু) ব্যবহার করে এটি সক্রিয় করতে সক্ষম হয়েছি; } অন্য {অবজেক্ট ও = (অবজেক্ট) স্ট্রিংভ্যালু; ফিরে; sample sample ব্যবহারের নমুনার প্রতিস্থাপন হিসাবে TConverter.ChangeType<T>(StringValue)
ম্যাট

14

অনেক ধরণের (পূর্ণসংখ্যা, ডাবল, ডেটটাইম ইত্যাদি) জন্য একটি স্থির পার্স পদ্ধতি রয়েছে। আপনি প্রতিবিম্ব ব্যবহার করে এটি প্রার্থনা করতে পারেন:

MethodInfo m = typeof(T).GetMethod("Parse", new Type[] { typeof(string) } );

if (m != null)
{
    return m.Invoke(null, new object[] { base.Value });
}

8
TypeDescriptor.GetConverter(PropertyObject).ConvertFrom(Value)

TypeDescriptorক্লাস হচ্ছে এমন পদ্ধতি GetConvertorযা কোনও Typeবস্তুকে গ্রহণ করে এবং তারপরে আপনি সেই নির্দিষ্ট অবজেক্টের জন্য ConvertFromরূপান্তর করতে পদ্ধতিটি কল করতে পারেন value


আমি ব্যক্তিগতভাবে মনে করি পদ্ধতিটি কনভার্টের পরিবর্তে রূপান্তর পরিচালনা করার জন্য এই ইন্টারফেসটি ভাল since
সৌলেল

3

আপনি সম্ভবত কোনও বৈশিষ্ট্য শ্রেণীর মতো একটি নির্মাণ ব্যবহার করতে পারেন । এইভাবে, আপনার কাছে একটি প্যারামিটারাইজড সহায়তা সহায়ক আছে যা জানে কীভাবে স্ট্রিংটিকে তার নিজস্ব মানের একটি মানে রূপান্তর করতে হয়। তারপরে আপনার প্রযোজকটি দেখতে দেখতে এমন হতে পারে:

get { return StringConverter<DataType>.FromString(base.Value); }

এখন, আমি অবশ্যই উল্লেখ করতে হবে যে প্যারামিটারাইজড প্রকারের সাথে আমার অভিজ্ঞতা সি ++ এবং এর টেম্পলেটগুলির মধ্যে সীমাবদ্ধ তবে আমি কল্পনা করি যে সি # জেনেরিকগুলি ব্যবহার করে একই ধরণের জিনিসটি করার কিছু উপায় আছে।


জেনেরিক সংস্করণগুলি সি # তে বিদ্যমান নেই।
শিমি ওয়েটজ্যান্ডলার

3

স্থির চেক করুন Nullable.GetUnderlyingType। - যদি অন্তর্নিহিত প্রকারটি শূন্য হয় তবে টেমপ্লেট পরামিতিটি নয়Nullable এবং আমরা সেই ধরণের সরাসরি ব্যবহার করতে পারি - যদি অন্তর্নিহিত প্রকারটি শূন্য না হয় তবে রূপান্তরটিতে অন্তর্নিহিত প্রকারটি ব্যবহার করুন।

আমার জন্য কাজ করে বলে মনে হয়:

public object Get( string _toparse, Type _t )
{
    // Test for Nullable<T> and return the base type instead:
    Type undertype = Nullable.GetUnderlyingType(_t);
    Type basetype = undertype == null ? _t : undertype;
    return Convert.ChangeType(_toparse, basetype);
}

public T Get<T>(string _key)
{
    return (T)Get(_key, typeof(T));
}

public void test()
{
    int x = Get<int>("14");
    int? nx = Get<Nullable<int>>("14");
}

1

বব এর উত্তর থেকে অনুপ্রেরণা সহ , এই এক্সটেনশানগুলি নাল মান রূপান্তর এবং সমস্ত আদিম রূপান্তরকে ফিরে এবং চতুর্থ সমর্থন করে।

public static class ConversionExtensions
{
        public static object Convert(this object value, Type t)
        {
            Type underlyingType = Nullable.GetUnderlyingType(t);

            if (underlyingType != null && value == null)
            {
                return null;
            }
            Type basetype = underlyingType == null ? t : underlyingType;
            return System.Convert.ChangeType(value, basetype);
        }

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

উদাহরণ

            string stringValue = null;
            int? intResult = stringValue.Convert<int?>();

            int? intValue = null;
            var strResult = intValue.Convert<string>();

0
public class TypedProperty<T> : Property
{
    public T TypedValue
    {
        get { return (T)(object)base.Value; }
        set { base.Value = value.ToString();}
    }
}

আমি কোনও বস্তুর মাধ্যমে রূপান্তরকারী ব্যবহার করছি। এটা একটু সহজ।


ধন্যবাদ আমাকে একটি ইন্টারফেসে একটি টি রূপান্তর করতে হবে এবং সাধারণ রূপান্তর টি অবজেক্টটি সঠিকভাবে, সহজ এবং দ্রুত কাজ করে ধন্যবাদ
LXG

5
(int-) (বস্তু) "54"; এটি একটি সত্য! এটি ভিবি নয়!
টোমর W

0

আমি লবোস উত্তর ব্যবহার করেছি এবং এটি কার্যকর হয়। সংস্কৃতি সেটিংসের কারণে আমার দ্বিগুণ রূপান্তর করতে সমস্যা হয়েছিল । তাই আমি যোগ

return (T)Convert.ChangeType(base.Value, typeof(T), CultureInfo.InvariantCulture);

0

তবুও অন্য একটি প্রকরণ। নুলাবলগুলি পরিচালনা করে, সেইসাথে স্ট্রিংটি নাল হয় এবং টি টি ছোট হয় না

public class TypedProperty<T> : Property where T : IConvertible
{
    public T TypedValue
    {
        get
        {
            if (base.Value == null) return default(T);
            var type = Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T);
            return (T)Convert.ChangeType(base.Value, type);
        }
        set { base.Value = value.ToString(); }
    }
}

0

আপনি এটি নীচের মত এক লাইনে করতে পারেন:

YourClass obj = (YourClass)Convert.ChangeType(YourValue, typeof(YourClass));

শুভ কোডিং;)


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