POCO的某种注释

时间:2012-03-19 12:20:27

标签: c# entity-framework annotations web-crawler

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

想法是这样的:

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

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

我想创建一个测试人员应用程序,它将:

  1. 获取项目的URL列表。下载它们,以某种格式存储。
  2. 我将手动检查项目的哪些属性被正确解析并将其标记为正确。
  3. 将以验证模式运行测试仪。它应该从网上再次加载所有内容,现在与我标记为正确的数据进行比较。
  4. 通过这种方式,我可以对规则进行一种单元测试,同时对其进行改进。

    现在回答实际问题:为了实现所有这些,我不想修改我的实体,我想有一些包装器如下:

    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 个答案:

答案 0 :(得分:1)

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

使用字符串的类的示例:

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;