Uniwersalna konwersja typów ogólnych z ciągu

Moim zadaniem jest napisanie metody StringToType (), która konwertuje ciąg znaków na określony typ T.

W przypadku typów pierwotnych używam metody Convert.ChangeType ()Dla typów wyliczeniowych - Enum.TryParse ()Dla wszystkich innych typów niestandardowych utworzyłem interfejs „IConvertibleFromString” zawierający metodę „FromString ()”, aby przekonwertować łańcuch na określony typ. Każda klasa, która będzie musiała przekonwertować z łańcucha, musi zaimplementować ten interfejs.

Ale nie podoba mi się sposób, w jaki zaimplementowałem metodę StringToType (). Chciałbym użyć mniej niż refleksji i zapewnić jak największą wydajność.

Proszę doradzić, jak najlepiej go wdrożyć / zmienić.

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);
    }
}

questionAnswers(3)

yourAnswerToTheQuestion