Universelle generische Typkonvertierung aus String

Meine Aufgabe ist es, eine Methode StringToType () zu schreiben, die einen String in den angegebenen Typ T konvertiert.

Für primitive Typen verwende ich die Methode Convert.ChangeType ()Für Aufzählungstypen - Enum.TryParse ()Für alle anderen benutzerdefinierten Typen habe ich eine Schnittstelle "IConvertibleFromString" erstellt, die eine Methode "FromString ()" enthält, um die Zeichenfolge in den angegebenen Typ zu konvertieren. Jede Klasse, die aus einem String konvertiert werden muss, muss diese Schnittstelle implementieren.

Mir gefällt aber nicht, wie ich die Methode StringToType () implementiert habe. Ich möchte weniger als die Reflexion verwenden und so viel wie möglich die Leistung sicherstellen.

Bitte geben Sie an, wie Sie es am besten implementieren / ändern können.

class Program
{
    static bool StringToType<T>(string str, ref T value)
    {
        Type typeT = typeof(T);
        bool isSuccess = false;
        if (typeT.GetInterface("IConvertibleFromString") != null)
        {
            return (bool)typeT.GetMethod("FromString").Invoke(value, new object[] { str });
        }
        else if (typeT.IsEnum)
        {
            MethodInfo methodTryParse = typeT.GetMethod("TryParse").MakeGenericMethod(typeT);
            return (bool)methodTryParse.Invoke(null, new object[] { str, value });
        }
        else if (typeT.IsPrimitive)
        {
            value = (T)Convert.ChangeType(str, typeT);
            return true;
        }
        return isSuccess;
    }

    static void Main(string[] args)
    {
        string intStr = "23";
        int val1 = 0;
        bool res = StringToType<int>(intStr, ref val1);
        Class1 c1;
        res = StringToType<Class1>(intStr, ref c1);
        Console.ReadKey();
    }
}

interface IConvertibleFromString
{
    bool FromString(string str);
}

class MySomeClass : IConvertibleFromString
{
    int someVal;

    public bool FromString(string str)
    {
        return int.TryParse(str, out someVal);
    }
}

Antworten auf die Frage(3)

Ihre Antwort auf die Frage