generics代表Parser 字典

我想创建一个解析器,它根据键将字符串标记转换为类型化对象。

我的第一个尝试,从Dictionary 借用不同类型代表的想法:Cleaner,非字符串方法名称?

delegate T Parser(string item); public class TableParser { static IDictionary<string, Pair> _PARSERS; static Type DOMAIN_TYPE; static TableParser() { DOMAIN_TYPE= typeof(Domain); Dictionary<string, Pair> parsers = new Dictionary<string, Pair>() { { "PropertyOne", new Pair( DOMAIN_TYPE.GetProperty("PropertyOne"), (Parser) double.Parse ) }, }; _PARSERS = parsers; } public List Parse(string filename) { List domains = new List(); List<List> data = CVSParser.Instance.Parse(filename); List headers = data[0]; for (int i = 1; i < data.Count; i++) { List row = data[i]; } return domains; } private Dictionary<int, Pair> FindParsers(List headers) { Dictionary<int, Pair> parsers = new Dictionary<int, Pair>(); int i = 0; headers.ForEach(h => { if (_PARSERS.ContainsKey(h)) { parsers[i] = _PARSERS[h]; } ++i; }); return parsers; } private Domain Create(List data, Dictionary<int, Pair> parsers) { Domain domain = new Domain(); foreach (KeyValuePair<int, Pair> parser in parsers) { string datum = data[parser.Key]; parser.Value.First.SetValue(domain, /* got stuck here */ parser.Value.Second, null); } return domain; } } 

当我需要使用它时,我无法重新发现解析器的类型。 我需要将它转换回ParserParser等,具体取决于PropertyInfo

在这种情况下,固定的CSV解析器不起作用,因为Domain的属性来自多个文件。

虽然我可能没有完整的图片,但看起来你制作的东西比他们需要的更复杂。

对PropertyType的简单切换以及对适当的解析方法的直接调用将使代码更易于理解和维护。 如果reflection成本让您担心,请使用库来生成直接引用该属性的委托。

也就是说,为了使您当前的解决方案工作,最简单的可能是使用代理的动态调用:

 parser.Value.First.SetValue(analytic, parser.Value.Second.DynamicInvoke(datum), null); 

我也无法抗拒提到上面引用的库提供的扩展方法,它允许您从一组值创建对象实例(数据类型不需要匹配,类型根据需要自动转换/强制),如下所示:

 var properties = new [] { "One", "Two" }; var inputValues = new object[] { 1.0d, "foobar" }; var domain = typeof(Domain).TryCreateInstance( properties, inputValues ); 

如果创建自己的解析器并非绝对必要,请使用Irony 。 它在C#中易于使用。 为什么重新发明?!

如果你想基于某些键新建对象,请看看这个问题,看起来很相似。 在你的情况下,听起来你甚至不必使用reflection,因为你想要创建的对象类型已经知道。

他们都可以共享一个界面吗? 在这种情况下,您可以使用一个abstract MyInterface CreateOne()方法来abstract MyInterface CreateOne()您可以在每个类上实现的实例。 否则问题的方法可能效果最好。

关心GJ