gpt4 book ai didi

c# - 尝试编写一个令人愉快的解析器

转载 作者:行者123 更新时间:2023-11-30 15:48:57 25 4
gpt4 key购买 nike

我正在编写一个简单的解析器,它将接受格式为 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 的属性
  • 它不处理已解析值的转换

关于如何编写这样一个“令人愉快的”解析器有什么想法吗?

最佳答案

我会尝试使用 Action 而不是 Func 并直接设置属性:

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);

关于c# - 尝试编写一个令人愉快的解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2177786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com