2012-03-19 67 views
0

作为我的大型项目的一部分,我正在开发一个网络解析器,根据预定义的规则,它将从网页获取数据并将其放入对象中。我写使用.NET 4.0 C#和SQL Server 2008POCOs的某种注释

想法是这样的:

假设我有一个Car { Power, Weight, Price }对象(这是一个POCO在EF用来存储数据)。 我为我的分析器创建了规则,所以当它扫描一些网站时,它会尝试填充对象的属性。

例如:Car { Power=100Hp, Weight=1000kg, Price=7000$ } 所有这些工作。但是由于所有网站都不同,即使在一个网站上,数据可以以不同的方式构建,我需要一些方法来验证我的解析规则。

我想创建一个测试应用程序,这将:

  1. 项目的URL列表取。下载它们,以某种格式存储。
  2. 我会手动检查项目的哪些属性被正确解析并标记为正确。
  3. 将在验证模式下运行测试仪。它应该再次从网上加载所有内容,然后与我标记为正确的数据进行比较。

这样我就可以对规则进行一种单元测试,而我改进它们。

现在变为实际的问题:为了实现这一切,我不希望修改我的实体,我想有一些包装,如:

Car { 
    Power { Value, IsCorrect}, 
    Weight {Value, IsCorrect}, 
    Price {Value, IsCorrect}} 

所以我所有的现有代码可以像以前一样工作,只有我的测试代码可以使用该注释信息。另外,当然,我希望这些信息可序列化,无论是数据库还是XML。

现在我的一般想法是将Car序列化到Xml中,然后手动添加注释属性并检查它们。通过手动在这里我的意思是通过使用XmlDocument方法。这应该工作,但我没有得出关于如何在内存中存储和访问注释的结论(我不喜欢通过XmlDocument进行所有验证的想法)

也许,在一些动态语言中,像javascript我只想补充注释这样

Car c = { Power = 1, Weight=2 ...}; 
c["Power_IsCorrect"] = true; 
c["Weight_IsCorrect"] = true; 
///... etc 

我不能在C#:(

回答

1

您可以创建一个小包装类,要么使用字符串来标识属性或表达式树。

想象服用点这样的

示例f或使用字符串类:

class AnnotatedObject<T> 
{ 
    private Dictionary<string, bool> _propertyMap = 
     new Dictionary<string, bool>(); 

    public AnnotatedObject(T originalObject) { OriginalObject = originalObject; } 

    public T OriginalObject { get; private set; } 
    public bool IsCorrect[string property] 
    { 
     get 
     { 
      bool result; 
      if(!_propertyMap.TryGetValue(property, out result)) 
       result = false; 
      return result; 
     } 
     set { _propertyMap[property] = value; } 
    } 
} 

然后,您可以使用这样的:

var annotatedCar = new AnnotatedObject<Car>(car); 
annotatedCar.IsCorrect["Power"] = true; 
+0

我想到了这样的事情,谢谢您的回答。我必须考虑它。 – 2012-03-20 09:57:32