Я пишу простой парсер, который возьмет строку в формате 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
- Это не относится к приведению значений, проанализированных
Есть какие-нибудь мысли о том, как написать "приятный" парсер, подобный этому?