Как преобразовать строковый тип в определенный пользователем тип - PullRequest
0 голосов
/ 31 августа 2010

У меня есть строковое значение, которое необходимо преобразовать в мой пользовательский тип. как это сделать, пожалуйста, помогите мне.

public class ItemMaster
{
    public static ItemMaster loadFromReader(string oReader)
    {
        return oReader;//here i am unable to convert into ItemMaster type
    }
}

Ответы [ 5 ]

5 голосов
/ 31 августа 2010

В зависимости от типа вы можете сделать это двумя способами.

Первый - это добавление конструктора к вашему типу, который принимает параметр String.

public YourCustomType(string data) {
    // use data to populate the fields of your object
}

второй добавляет статический Parse метод.

public static YourCustomType Parse(string input) {
    // parse the string into the parameters you need
    return new YourCustomType(some, parameters);
}
2 голосов
/ 31 августа 2010

Создайте метод Parse для вашего пользовательского пользовательского типа:

public class MyCustomType
{
    public int A { get; private set; }
    public int B { get; private set; }

    public static MyCustomType Parse(string s)
    {
        // Manipulate s and construct a new instance of MyCustomType
        var vals = s.Split(new char[] { '|' })
            .Select(i => int.Parse(i))
            .ToArray();

        if(vals.Length != 2)
            throw new FormatException("Invalid format.");

        return new MyCustomType { A = vals[0], B = vals[1] };            
    }
}

Конечно, приведенный пример чрезвычайно прост, но, по крайней мере, поможет вам начать.

1 голос
/ 31 августа 2010

Сначала вам нужно определить формат, которому будет следовать ваш тип при преобразовании в строку.Простой пример - номер социального страхования.Вы можете легко описать это как регулярное выражение.

\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;
    }
}
1 голос
/ 31 августа 2010

Convert.ChangeType() метод может помочь вам.

string sAge = "23";
int iAge = (int)Convert.ChangeType(sAge, typeof(int));
string sDate = "01.01.2010";
DateTime dDate = (DateTime)Convert.ChangeType(sDate, typeof(DateTime));
0 голосов
/ 31 августа 2010

Для фактического преобразования нам нужно увидеть структуру класса для. Однако скелет для этого будет выглядеть следующим образом:

class MyType
{
    // Implementation ...

    public MyType ConvertFromString(string value)
    {
        // Convert this from the string into your type
    }
}
...