Rob*_*vey 7 c# reflection performance properties .net-3.5
我有几个c#结构,它们为非常大的数据文件中的结构提供了形状.这些结构解释文件数据字中的位,并将它们转换为第一类属性.这是一个例子:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct TimeF1_MsgDayFmt
{
// Time Data Words
public UInt16 TDW1;
public UInt16 TDW2;
public UInt16 TDW3;
/// <summary>
/// Tens of milliseconds
/// </summary>
public UInt16 Tmn
{
// Bits.Get is just a helper method in a static class
get { return Bits.Get(TDW1, 0, 4); }
set
{
if (value > 9)
throw new ArgumentOutOfRangeException();
TDW1 = Bits.Set(TDW1, value, 0, 4);
}
}
/// Several other properties follow.
Run Code Online (Sandbox Code Playgroud)
我需要做两件事,我认为这些事情是相关的.第一种是使用一组验证规则来验证整个类.我知道有几种方法可以做到这一点; 最吸引我的是用这样的东西来注释每个属性:
[ValidateRange(0,9)]
public UInt16 Tmn
{
get { return Bits.Get(TDW1, 0, 4); }
set
{
/// etc. Will probably no longer throw the ArgumentOutOfRangeException here.
Run Code Online (Sandbox Code Playgroud)
...然后使用Validator类来读取所有属性属性,根据带注释的规则检查每个属性值,并返回错误对象的集合.但我担心反思要花多长时间; 这些结构必须非常高性能.
public List<Error> Validate(TimeF1_MsgDayFmt original)
Run Code Online (Sandbox Code Playgroud)
我需要做的第二件事是对财产变化进行审计; 也就是说,对于每个已从其原始值更改的属性,我需要能够获得一个字符串,其中显示"Property foo已从bar更改为baz". 要做到这一点,我想要一种方法来比较"之前"和"之后"的所有属性struct,并注意差异.
public List<string> Compare(TimeF1_MsgDayFmt original, TimeF1_MsgDayFmt new)
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,代码都将涉及迭代所有属性并以尽可能快的方式单独检查每个属性.
我该如何处理?
如果问题是,读入结构的数据是否与附加约束匹配,那么您首先必须弄清楚如何写下此类约束。(在您的示例中,您将[ValidateRange(0,9)]编写为此类约束之一)。
一旦您有办法写下约束,那么您就必须将数据读入相应的结构中,然后检查约束。(在您的示例中,您提出了使用反射的想法)。
在我看来,写下此类约束的最简单且执行速度快的方法就是将它们简单地编写为附加的 C# 代码。对于您可以想象的每个约束,您可以添加一个类方法来检查约束并返回一个布尔值。您可以添加标准约束“CheckIt”来计算所有单独约束方法的合取。
编写约束应该很容易。我希望 C# 编译器内联其他方法,特别是如果它们很小并且不带参数(隐含类除外)。这应该会让他们很快。
如果 C# 编译器不这样做,请切换到 C++,在这里您几乎可以强制内联。