Проблема в том, что вы пытаетесь сделать что-то общее , которое на самом деле не так. Даже если вы вручную просматриваете все типы, которые можете анализировать сами, это не учитывает все типы.
Почему бы тебе не попробовать это вместо этого? Сначала определите делегата, который описывает общий TryParse
метод:
public delegate bool TryParser<T>(string text, out T value);
Затем реструктурируйте ваш метод, чтобы взять один из них в качестве параметра:
// uglified code to fit within horizontal scroll area
public bool TryParse<T>
(XElement element, string attributeName, TryParser<T> tryParser, out T value)
{
value = default(T);
if (
element.Attribute(attributeName) != null &&
!string.IsNullOrEmpty(element.Attribute(attributeName).Value)
)
{
string valueString = element.Attribute(attributeName).Value;
return tryParser(valueString, out value);
}
return false;
}
Теперь перегрузить это для всех стандартных типов довольно тривиально:
public bool TryParseInt(XElement element, string attributeName, out int value)
{
return TryParse<int>(element, attributeName, int.TryParse, out value);
}
public bool TryParseBool(XElement element, string attributeName, out bool value)
{
return TryParse<bool>(element, attributeName, bool.TryParse, out value);
}
и т. Д.
Что хорошо в этом подходе, так это то, что он даже не ограничивает вас использованием ограничения where T : struct
или даже встроенными типами .NET. Пользователь этого класса синтаксического анализатора может анализировать свои собственные типы из XML-документа, просто определяя TryParse
-подобный метод для своих пользовательских типов.