Как обобщить универсальный метод для анализа текста и назначения списка переменных для различного числа переменных?

1

Мне нужно прочитать выделенный раздел (или запятую) и назначить их списку встроенных переменных (int, char, string и т.д., Но не объектов). Я хочу обработать это с помощью общего метода. Вот рабочий код, который я использую для случая с тремя переменными.

public static void ReadVariablesFromString<T0, T1, T2>(out T0 input0, out T1 input1, out T2 input2, string stringIn, char[] separators)
{
    string[] stringParts = stringIn.Split(separators);
    input0 = ConvertTo<T0>(stringParts[0]);
    input1 = ConvertTo<T1>(stringParts[1]);
    input2 = ConvertTo<T2>(stringParts[2]);
}

public static T ConvertTo<T>(object value)
{
    return (T)Convert.ChangeType(value, typeof(T));
}

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

string str = "a\t123\tbcd";

char var1;
int var2;
string var3;

char[] separators = { '\t' };

ReadVariablesFromString(out var1, out var2, out var3, str, separators);

Есть ли способ обобщить эту модель для разных переменных? Можно ли написать общий метод, который принимает различное количество переменных для этого конкретного случая?

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

Теги:
generic-programming

2 ответа

1

Нет, в С# вы не можете отправить массив ссылок переменных.

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

См. Перечисление через свойства объекта (строка) в С# и Задание свойства объекта с помощью отражения и Как динамически передать объект строки типа объекту типа T на некоторые детали.

1

Я предлагаю вам вернуть список

List<object> variables = ReadVariablesFromString(str, separators);

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

variables.ElementAt(0) will be 'a'

Поскольку тип списка является "объектом", вы можете хранить там любой тип данных, поскольку каждый тип в конечном итоге наследует от object. Вам нужно будет использовать данные, когда вам нужно их использовать, хотя

char letter = (char)variables.ElementAt(0)

Но вы должны делать что - то подобное уже, иначе как бы вы знаете, какую переменную поставить в каждом приходящего out параметра.

Это означает, что у вас больше гибкости в количестве переменных, которые вы можете вернуть из ReadVariablesFromString()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню