Сначала вам нужно определить формат, которому будет следовать ваш тип при преобразовании в строку.Простой пример - номер социального страхования.Вы можете легко описать это как регулярное выражение.
\d{3}-\d{2}-\d{4}
После этого вам просто нужно повернуть процесс вспять.Соглашение заключается в определении метода Parse
и метода TryParse
для вашего типа.Разница в том, что TryParse
не будет выдавать исключение.
public static SSN Parse(string input)
public static bool TryParse(string input, out SSN result)
Теперь процесс, который вы выполняете для фактического анализа входной строки, может быть настолько сложным или настолько простым, насколько вы пожелаете.Обычно вы бы токенизировали входную строку и выполняли синтаксическую проверку. (Пример: может ли тире идти сюда?)
number
dash
number
dash
number
Это действительно зависит от того, сколько работы вы хотите вложить в него.Вот базовый пример того, как вы можете токенизировать строку.
private static IEnumerable<Token> Tokenize(string input)
{
var startIndex = 0;
var endIndex = 0;
while (endIndex < input.Length)
{
if (char.IsDigit(input[endIndex]))
{
while (char.IsDigit(input[++endIndex]));
var value = input.SubString(startIndex, endIndex - startIndex);
yield return new Token(value, TokenType.Number);
}
else if (input[endIndex] == '-')
{
yield return new Token("-", TokenType.Dash);
}
else
{
yield return new Token(input[endIndex].ToString(), TokenType.Error);
}
startIndex = ++endIndex;
}
}