2010-08-31 3 views
-1

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

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

Не могли бы вы привести пример того, что вы пытаетесь сделать? –

+0

Можете ли вы дать несколько примеров фрагментов кода? –

+8

Это возможно быть более расплывчатым, вы знаете. – Marc

ответ

4

В зависимости от вашего типа есть два способа, которыми вы могли бы это сделать.

Первый добавляет конструктор к вашему типу, который принимает параметр 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); 
} 
+1

Хороший ответ. Просто примечание по второму примеру - статус-кво - это этот метод 'Parse'. – Jamiec

+0

@Jamiec, да, я знаю это, но я думаю, что имя FromString гораздо более описательное. – jjnguy

+0

@ Джейми, я изменил название метода. – jjnguy

2

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

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

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

+0

Можете ли вы привести пример? – Pradeep

0

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

class MyType 
{ 
    // Implementation ... 

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

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

Невозможно знать это, так как это определенный пользователем тип. –

1

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

\d{3}-\d{2}-\d{4} 

После этого вам просто нужно обратить вспять процесс. Соглашение заключается в определении метода Parse и метода TryParse для вашего типа. Разница заключается в том, что TryParse не будет генерировать исключение.

public static SSN Parse(string input) 
public static bool TryParse(string input, out SSN result) 

Теперь процесс вы будете следовать, чтобы фактически разобрать строку ввода может быть столь же сложным или же просто, как вы хотите. Обычно вы должны токенизировать входную строку и выполнять синтаксическую проверку. (EX: Может тир идти сюда?)

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; 
    } 
} 
Смежные вопросы