Я пишу простой парсер, который будет принимать строку формата 20100101,1,2,foo
и создать экземпляр следующего класса:Попытка написать приятный анализатор
public class Foo
{
public DateTime TheDate { get; set; }
public int TheFirstInt { get; set; }
public int TheSecondInt { get; set; }
public string TheString { get; set; }
}
Я хотел бы иметь возможность заявить о своих парсерах для каждого свойства в виде массива (например) Func<>s
, чтобы сделать код более читаемым (с точки зрения корреляции элементов в строке с используемым кодом разбора).
// Production code would contain parsers with error checking etc.
Func<string, object>[] parsers = new Func<string, object>[]
{
s => DateTime.ParseExact(s, "yyyyMMdd", CultureInfo.InvariantCulture),
s => int.Parse(s),
s => int.Parse(s),
s => s
};
Я тогда хотел, чтобы иметь возможность перебирать анализаторы, свойство FooClass
и значение в fooItems
в одном цикле:
Foo fooInstance = new Foo();
string[] fooItems = fooString.Split(',');
for (int i = 0; i < parsers.Length; i++)
{
fooInstance.Properties[i] = parsers[i](fooItems[i]);
// range-checking and error handling excluded from this example
}
Однако, это, конечно, не будет работать, потому что:
- Это не решает, как вы могли бы перебрать свойства
fooInstance
- Не имеет значения для литья значений, проанализированных
Любые идеи о том, как написать «приятный» парсер, как это?
Первое, что я подумал, когда увидел, что этот вопрос был «Простите меня, кажется, что введенный вами ввод содержит«; » к которому я не привык ». –