序列中的C#类属性(Sequence the Properties in a C# Class)

2019-09-19 06:28发布

我们有我们需要解析,看起来像一个文件格式:

v1|000|sammy|endpoint|blah

这是一个有序固定宽度格式的供应商提供给我们,所以每个这些5个字段的映射到在类(实际格式具有> 30)的特定性质。

我想通过应用程序的性能与反思只是解析此。 我能做到这一点的方法之一是只是做的东西了自己 - 写属性类,它需要一个单号,且该属性应用到其序列索引中的每个属性和排序依据子句中的反思中寻找它。

有一个现有的或更好的方式在C#这样做吗? 例如,有没有已经为这个属性? 有没有办法问在C#或者甚至MSIL在类中声明什么顺序属性?

Answer 1:

使用其中属性出现在元数据中的顺序是可见PropertyInfo.MetadataToken 。 恰巧,目前的编译器将使这个顺序匹配的属性出现在源代码中的顺序,因此通过订购MetadataToken ,你得到的顺序相同的源代码。

免责声明:将来的编译器可能会改变这种情况。 它可能不会,如果有任何理由,但如果编译器,例如,变得多线程的,它可能需要额外的不必要的努力,以保持原来的顺序。 如果你靠这个,一定要确保你得到一个严重的错误,而不是沉默的运行时损坏,如果/当.NET框架以这样的方式进行更新,这个休息。



Answer 2:

我想,身体力行,做一个自定义属性对于这一点,如果你想使用属性为基础的方法。 这不是一个“标准”操作,所以没有在其中,你可以用它来装饰你的类框架的(适用)的属性。

我的方法很可能是一类级别的属性,它接受一个字符串数组每列表中的条目,或东西沿着这些线路的属性名称。

话虽这么说,我质疑基于属性的方法是否是正确的做法都没有。 你可能会需要某种类型管理器类的中介这一点,因为事情需要做“反思”的过程。 它可能更有意义,有一流的管理这里的关系,特别是因为它已经将需要你的类层次的知识(以构建在首位类)。

在这一点上,有一个自定义类或方法,可以直接构造一个对象会表现得更好,更容易维护,而且远比试图使用反射简单,做动态。



Answer 3:

您是否在使用.NET 4.0? 这似乎正是在那种情况动态关键字是为创建。 也就是说,好像为了和一致性更重要比什么具体类型正好是在任何时间点,所以你可以只随意指定标题,数据,无论对动态物体通过两者的规则让你快乐,然后将他们拉回来了使用同样的规则。 这也将(大概)允许您不使用反射,这始终是一个加号。



Answer 4:

我建议使用类似的分析FileHelpers 。



Answer 5:

现在,如果性能是不是一个大问题,你与思考下去,那么一个简单的方法来获得不带属性是使用使用正则表达式组解析映射。 与此相似的实现: 阅读从文本文件固定宽度记录

使用正则表达式,如:

"^(?<Field1>.{6})(?<Field2>.{16})(?<Field3>.{12})"

既然你可以自己定义组的名称,你可以明智地选择的名称完全符合您的属性名称,以及这样的地图会自动使用反射,而无需使用属性。

编辑:既然你会最终有一个字符串中的属性名称,该不会是很“重构友好”我强烈推荐单元测试这种彻底保证重新命名属性时产生的不匹配将打破测试。



Answer 6:

你可以看看如何实现类似的东西谷歌的协议缓冲器 。

目前还没有任何的C#实现(据我所知),但提供的文档是非常好,应该给你一些想法,将执行比反射而大大降低,通常复杂越好。



Answer 7:

当然也有很多可能的答案在这里,所以这里有一个马马虎虎一个我碰到:

有一个名为ColumnAttribute在System.ComponentModel.DataAnnotations现有的属性(在.net 4.5 +,它移到System.ComponentModel.DataAnnotations.Schema):

http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.schema.columnattribute(v=vs.110 )

你可以使用它,如:

[Column(Order=1)]
public string Version { get; set; }

[Column(Order=2)]
public string Id { get; set; }

但是,这显然是烦人,如果固定宽度的格式更改更新 - 你必须手动去和改变,如果说你进入了30+序,场朝开始增加。 因为在这种情况下,我们无法控制的格式和未来版本可以拿出频繁,这将是很好的从订单属性在类中输入找到与隐含序列东西。



文章来源: Sequence the Properties in a C# Class