我正在编写一个简单的解析器,它将接收一个格式为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
属性的问题 - 它没有处理解析值的强制转换
你有什么关于如何编写类似这样的“友好”解析器的想法吗?