स्ट्रिंग से जेनेरिक प्रकार रूपांतरण

मेरे पास एक वर्ग है जिसे मैं किसी अन्य वर्ग के लिए "गुण" स्टोर करने के लिए उपयोग करना चाहता हूं। इन गुणों में बस एक नाम और एक मूल्य है। आदर्श रूप में, मैं जो चाहता हूं वह टाइप किया गया गुण जोड़ने में सक्षम होना है, ताकि "मान" लौटाया जा सके हमेशा उस प्रकार का होता है जिसे मैं चाहता हूं।

प्रकार हमेशा एक आदिम होना चाहिए। यह वर्ग एक अमूर्त वर्ग उपclasses जो मूल रूप से नाम और मूल्य स्ट्रिंग के रूप में स्टोर करता है। विचार यह है कि यह सबक्लास बेस क्लास में कुछ प्रकार की सुरक्षा जोड़ देगा (साथ ही मुझे कुछ रूपांतरण पर सहेज रहा है)।

इसलिए, मैंने एक कक्षा बनाई है जो लगभग (लगभग) है:

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

तो सवाल यह है:

क्या स्ट्रिंग से वापस आदिम में परिवर्तित करने का "सामान्य" तरीका है?

मुझे कोई सामान्य इंटरफ़ेस नहीं मिल रहा है जो बोर्ड में रूपांतरण को लिंक करता है (कुछ ऐसा है जैसे ITryParsable आदर्श होगा!)।

0
ro fr bn
मुझे आपकी कंक्रीट कक्षा का एक उदाहरण देखने में दिलचस्पी होगी, यहां तक ​​कि सिर्फ एक स्निपेट भी। :)
जोड़ा लेखक Jon Limjap, स्रोत
क्या आप अपनी बेस क्लास के प्रासंगिक हिस्सों को पोस्ट कर सकते हैं?
जोड़ा लेखक JJS, स्रोत

9 उत्तर

आप संभवतः एक विशेषता वर्ग जैसे निर्माण का उपयोग कर सकते हैं। इस तरह, आपके पास एक पैरामीटरयुक्त हेल्पर क्लास होगा जो जानता है कि स्ट्रिंग को अपने प्रकार के मान में कैसे परिवर्तित किया जाए। फिर आपका गेटर इस तरह दिख सकता है:

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

अब, मुझे यह इंगित करना होगा कि पैरामीटरयुक्त प्रकारों के साथ मेरा अनुभव सी ++ और उसके टेम्पलेट तक सीमित है, लेकिन मुझे लगता है कि सी # जेनेरिक का उपयोग करके एक ही तरह की चीज करने का कोई तरीका है।

0
जोड़ा
जेनेरिक संस्करण सी # में मौजूद नहीं हैं।
जोड़ा लेखक Shimmy, स्रोत

फिर भी एक और बदलाव। Nullables हैंडल, साथ ही परिस्थितियों जहां स्ट्रिंग शून्य है और टी नहीं शून्य है।

public class TypedProperty : 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
जोड़ा

मैंने लॉबोस जवाब का इस्तेमाल किया और यह काम करता है। लेकिन संस्कृति सेटिंग्स के कारण मुझे युगल के रूपांतरण के साथ कोई समस्या थी। तो मैंने जोड़ा

return (T)Convert.ChangeType(base.Value, typeof(T), CultureInfo.InvariantCulture);
0
जोड़ा

मुझे यकीन नहीं है कि मैं आपके इरादों को सही ढंग से समझता हूं, लेकिन देखते हैं कि यह मदद करता है या नहीं।

public class TypedProperty : Property where T : IConvertible
{
    public T TypedValue
    {
        get { return (T)Convert.ChangeType(base.Value, typeof(T)); }
        set { base.Value = value.ToString();}
    }
}
0
जोड़ा
यह केवल तभी काम करता है जब आपका प्रकार IConvertible लागू करता है
जोड़ा लेखक Kilhoffer, स्रोत
मैं कुछ दिनों के लिए सोच रहा हूं कि कैसे एक सामान्य प्रकार में एक धारा को deserialize। धन्यवाद :)
जोड़ा लेखक Trap, स्रोत
मैं निश्चित रूप से कहां टी: IConvertible जोड़ देंगे
जोड़ा लेखक MikeT, स्रोत
मैं सहमत हूं, हालांकि कनवर्ट करें। चेंजटाइप बहुत सार्वभौमिक और एक्स्टेंसिबल समाधान नहीं है, यह सबसे बुनियादी प्रकारों के लिए काम करता है। अगर कुछ बेहतर की जरूरत है, तो इस विधि को टिम सुझाए गए या अलग-अलग रूपांतरण विधि का उपयोग करने के लिए किसी भी चीज को लपेटने में कोई समस्या नहीं है।
जोड़ा लेखक lubos hasko, स्रोत
टाइप टी को IConvertible नहीं होना चाहिए, लेकिन आधार का प्रकार। वैल्यू चाहिए।
जोड़ा लेखक chapluck, स्रोत
जोड़ा लेखक chapluck, स्रोत

कई प्रकारों (पूर्णांक, डबल, डेटटाइम इत्यादि) के लिए, एक स्थिर पार्स विधि है। आप प्रतिबिंब का उपयोग करके इसे आमंत्रित कर सकते हैं:

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

if (m != null)
{
    return m.Invoke(null, new object[] { base.Value });
}
0
जोड़ा

लुब्स हैस्को की विधि नलिकाओं के लिए विफल रहता है। नीचे दी गई विधि नलिकाओं के लिए काम करेगी। हालांकि, मैं इसके साथ नहीं आया था। मैंने इसे Google के माध्यम से पाया: http://web.archive.org/web/20101214042641/http://dogaoztuzun.com/post/C-Generic- टाइप- Conversion.aspx "टूना Toksoz" को क्रेडिट

उपयोग पहले:

TConverter.ChangeType(StringValue);  

कक्षा नीचे है।

public static class TConverter
{
    public static T ChangeType(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() where TC : TypeConverter
    {

        TypeDescriptor.AddAttributes(typeof(T), new TypeConverterAttribute(typeof(TC)));
    }
}
0
जोड़ा
ठीक काम करता है, लेकिन यदि टी एक ऑब्जेक्ट है, तो अपवाद फेंकता है। मैं काम करने में सक्षम था कि `if (टाइपोफ (टी) IsPrimitive) {वापसी TConverter.ChangeType (स्ट्रिंगवैल्यू) का उपयोग करके; } else {object o = (ऑब्जेक्ट) स्ट्रिंगवैल्यू; को वापस; } 'उपयोग नमूना के लिए प्रतिस्थापन के रूप में TConverter.ChangeType (स्ट्रिंगवैल्यू)
जोड़ा लेखक Matt, स्रोत
RegisterTypeConverter क्यों? क्या हमें कन्वर्टर्स को हाथ से पहले पंजीकरण करने की ज़रूरत है? (दुर्भाग्य से लिंक मर चुका है, इसलिए मैं इसे पढ़ नहीं पाया)
जोड़ा लेखक Cohen, स्रोत
एकाधिक रूपांतरणों के लिए आपको शायद एक बार tc ( TypeConverter ) बनाना चाहिए। TypeConverter धीमा है क्योंकि यह TypeConverterAttribute को खोजने के लिए प्रतिबिंब का उपयोग करता है। यदि आप एक निजी <�कोड> टाइप कनवर्टर फ़ील्ड प्रारंभ करते हैं, तो आपको कई बार TypeConverter का पुन: उपयोग करने में सक्षम होना चाहिए।
जोड़ा लेखक Kevin P. Rice, स्रोत
मैं एनम्स और अन्य कॉम्प्लेक्स संरचनाओं के लिए एक फ़ॉलबैक कन्वर्ट विकल्प जोड़ूंगा, लेकिन अच्छी कॉल।
जोड़ा लेखक Tomer W, स्रोत
public class TypedProperty : Property
{
    public T TypedValue
    {
        get { return (T)(object)base.Value; }
        set { base.Value = value.ToString();}
    }
}

मैं किसी ऑब्जेक्ट के माध्यम से कनवर्ट करना का उपयोग कर रहा हूं। यह थोड़ा सा सरल है।

0
जोड़ा
(Int) (वस्तु) "54"; एक वास्तविकता है !, यह वीबी नहीं है!
जोड़ा लेखक Tomer W, स्रोत
धन्यवाद मुझे एक इंटरफेस में एक टी को परिवर्तित करना है और सरल रूपांतरण टी ऑब्जेक्ट सही ढंग से, आसान और तेज़ धन्यवाद काम करता है
जोड़ा लेखक LXG, स्रोत
TypeDescriptor.GetConverter(PropertyObject).ConvertFrom(Value)

TypeDescriptor is class having method GetConvertor which accept a Type object and then you can call ConvertFrom method to convert the value for that specified object.

0
जोड़ा
पहले से ही सही जवाब दिया है?
जोड़ा लेखक nawfal, स्रोत

स्थिर Nullable.GetUnderlyingType देखें। - यदि अंतर्निहित प्रकार शून्य है, तो टेम्पलेट पैरामीटर Nullable नहीं है, और हम सीधे उस प्रकार का उपयोग कर सकते हैं - यदि अंतर्निहित प्रकार शून्य नहीं है, तो रूपांतरण में अंतर्निहित प्रकार का उपयोग करें।

लगता है मेरे लिए काम करता है:

public object Get( string _toparse, Type _t )
{
   //Test for Nullable 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(string _key)
{
    return (T)Get(_key, typeof(T));
}

public void test()
{
    int x = Get("14");
    int? nx = Get>("14");
}
0
जोड़ा