केवल रन-टाइम में ज्ञात प्रकार में परिवर्तनशील चर?


86
foreach (var filter in filters)
{
    var filterType = typeof(Filters);
    var method = filterType.GetMethod(filter, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Static);
    if (method != null)
    {
        var parameters = method.GetParameters();
        Type paramType = parameters[0].ParameterType;
        value = (string)method.Invoke(null, new[] { value });
    }
}

मैं कैसे डाल सकता valueकरने के लिए paramType? valueएक है string, paramTypeशायद सिर्फ एक बुनियादी प्रकार की तरह होगा int, stringया शायद float। अगर कोई रूपांतरण संभव नहीं है, तो मैं एक अपवाद को फेंकने के साथ शांत हूं।




4
@ माइकलफ्रीजिम की टिप्पणी पूर्ववर्ती की संभावित नकल है।
— किमीोट

1
@kmote, "संभव डुप्लिकेट" टिप्पणी आमतौर पर स्वचालित रूप से उत्पन्न होती है जब कोई व्यक्ति डुप्लिकेट के रूप में प्रश्न को बंद करने के लिए वोट करता है। सुनिश्चित नहीं हैं कि पहली टिप्पणी के वृद्धिशील वोट के बजाय सिस्टम ने दूसरी बार उसी टिप्पणी को क्यों डाला। हो सकता है कि सबसे पुरानी टिप्पणी मैन्युअल रूप से बनाई गई थी, क्योंकि इसमें 'संभव' में लो-केस पी है
— माइकल फ्रीजिम

@kmote, यह एक ज्ञात मुद्दा है meta.stackoverflow.com/questions/367526/…
— माइकल फ्रीजिम

जवाबों:


89

प्रकार आप सभी कार्यान्वयन का उपयोग कर रहे हैं IConvertible। जैसे आप उपयोग कर सकते हैं ChangeType।

 value = Convert.ChangeType(method.Invoke(null, new[] { value }), paramType);

13
कमाल ... सिंगल लाइन में। var value = Convert.ChangeType (objectValue, objectType);
— रिगिन

17

आप गतिशील हो सकते हैं; उदाहरण के लिए:

using System;

namespace TypeCaster
{
    class Program
    {
        internal static void Main(string[] args)
        {
            Parent p = new Parent() { name = "I am the parent", type = "TypeCaster.ChildA" };
            dynamic a = Convert.ChangeType(new ChildA(p.name), Type.GetType(p.type));
            Console.WriteLine(a.Name);

            p.type = "TypeCaster.ChildB";
            dynamic b = Convert.ChangeType(new ChildB(p.name), Type.GetType(p.type));
            Console.WriteLine(b.Name);
        }
    }

    internal class Parent
    {
        internal string type { get; set; }
        internal string name { get; set; }

        internal Parent() { }
    }

    internal class ChildA : Parent
    {
        internal ChildA(string name)
        {
            base.name = name + " in A";
        }

        public string Name
        {
            get { return base.name; }
        }
    }

    internal class ChildB : Parent
    {
        internal ChildB(string name)
        {
            base.name = name + " in B";
        }

        public string Name
        {
            get { return base.name; }
        }
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.