首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >试图写一个愉快的解析器

试图写一个愉快的解析器
EN

Stack Overflow用户
提问于 2010-02-01 15:33:59
回答 3查看 261关注 0票数 3

我正在编写一个简单的解析器,它将采用20100101,1,2,foo格式的字符串并创建以下类的实例:

代码语言:javascript
复制
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数组,以使代码更加可读性(从字符串中的项与所使用的解析代码相关联的角度来看)。

代码语言:javascript
复制
// 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中的值:

代码语言:javascript
复制
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

  • It的属性不处理解析的

值的转换

对于如何写这样一个“愉快”的解析器,有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-02-01 15:46:03

我尝试使用Actions而不是Funcs,并直接设置属性:

代码语言:javascript
复制
Action<string, FooClass>[] actions = new Action<string, FooClass>[] {
    (s, c) => c.TheDate = DateTime.ParseExact(s, "yyyyMMdd", CultureInfo.InvariantCulture),
    (s, c) => c.TheFirstInt = Int32.Parse(s)
    // ...
}

for (int i = 0; i < fooItems.Length; ++i)
    actions[i](fooItems[i], fooInstance);
票数 2
EN

Stack Overflow用户

发布于 2010-02-01 16:05:15

我知道这不是直接回答你的问题,但如果你发现你的“语言”变得复杂得多,那么我建议你用反讽来解析它:http://www.codeplex.com/irony

如果您的语言将保持平面格式(如CSV),那么值得一看http://www.filehelpers.com/

在您的示例中,只需注释您的类:

代码语言:javascript
复制
[DelimitedRecord(",")]
public class Foo
{
    [FieldConverter(ConverterKind.Date, "yyyyMMdd")]
    public DateTime TheDate { get; set; }
    public int TheFirstInt { get; set; }
    public int TheSecondInt { get; set; }
    public string TheString { get; set; }
}

然后用以下方法解析它:

代码语言:javascript
复制
FileHelperEngine engine = new FileHelperEngine(typeof(Foo));
Foo[] fs = engine.ReadFile("FileIn.txt") as Foo[];
票数 2
EN

Stack Overflow用户

发布于 2010-02-01 15:38:30

你需要使用反射:

代码语言:javascript
复制
fooInstance.GetType().GetProperty("SomeProp").SetValue(fooInstance, "SomeProp", val);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2177786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档