Я написал универсальные методы, которые используют рефлексию для поиска подходящего Parse
метода и вызова его. Но они не будут работать, если вы хотите преобразовать string
в string
, так как string
не имеет Parse
метода. Так что вам нужно добавить специальный случай для string
.
Я тоже не понимаю, почему ваша функция называется GetDefaultValue
. Почему бы не Parse
, TryParse
, ConvertFromString
или что-то в этом роде? Когда я вижу функцию с именем GetDefaultValue
, я не думаю о функции синтаксического анализа.
Проверьте этот старый вопрос:
Можно ли создать общий синтаксический анализатор чисел в C #? , который имеет несколько соответствующих ответов.
И мой старый ответ оттуда:
Я написал некоторый код, который использует отражение, чтобы найти Parse
/ TryParse
методы для типа и получить доступ к ним из универсальных функций:
private static class ParseDelegateStore<T>
{
public static ParseDelegate<T> Parse;
public static TryParseDelegate<T> TryParse;
}
private delegate T ParseDelegate<T>(string s);
private delegate bool TryParseDelegate<T>(string s, out T result);
public static T Parse<T>(string s)
{
ParseDelegate<T> parse = ParseDelegateStore<T>.Parse;
if (parse == null)
{
parse = (ParseDelegate<T>)Delegate.CreateDelegate(typeof(ParseDelegate<T>), typeof(T), "Parse", true);
ParseDelegateStore<T>.Parse = parse;
}
return parse(s);
}
public static bool TryParse<T>(string s, out T result)
{
TryParseDelegate<T> tryParse = ParseDelegateStore<T>.TryParse;
if (tryParse == null)
{
tryParse = (TryParseDelegate<T>)Delegate.CreateDelegate(typeof(TryParseDelegate<T>), typeof(T), "TryParse", true);
ParseDelegateStore<T>.TryParse = tryParse;
}
return tryParse(s, out result);
}
https://github.com/CodesInChaos/ChaosUtil/blob/master/Chaos.Util/Conversion.cs
Но я не слишком много их тестировал, так что они могут иметь некоторые ошибки / работать некорректно с каждым типом. Обработка ошибок тоже немного отсутствует.
И у них нет перегрузок при разборе инварианта культуры. Поэтому вам, вероятно, нужно добавить это.