C# POCOs的某种注释

C# POCOs的某种注释,c#,entity-framework,annotations,web-crawler,C#,Entity Framework,Annotations,Web Crawler,作为我更大项目的一部分,我正在为web开发一个解析器,根据预定义的规则,它将从web页面获取数据并将其放入对象中。我使用.NET4.0和SQLServer2008用C#编写 这个想法是这样的: var annotatedCar = new AnnotatedObject<Car>(car); annotatedCar.IsCorrect["Power"] = true; 假设我有一个Car{Power,Weight,Price}对象(EF中用于存储数据的POCO)。 我为解析器创建

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

这个想法是这样的:

var annotatedCar = new AnnotatedObject<Car>(car);
annotatedCar.IsCorrect["Power"] = true;
假设我有一个
Car{Power,Weight,Price}
对象(EF中用于存储数据的POCO)。 我为解析器创建规则,所以当它扫描某个站点时,它将尝试填充对象的属性

例如:
Car{Power=100Hp,Weight=1000kg,Price=7000$}
所有这些都在起作用。但是,由于所有站点都不同,甚至在一个站点上,数据的结构也可能不同,因此我需要某种方法来验证我的解析规则

我想创建一个测试程序,它将:

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

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

    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中会出现这样的情况:(

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

    使用字符串的类的示例:

    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; }
        }
    }
    
    类注释对象
    {
    专用字典_propertyMap=
    新字典();
    公共注释对象(T originalObject){originalObject=originalObject;}
    公共T原始对象{get;私有集;}
    公共bool IsCorrect[字符串属性]
    {
    得到
    {
    布尔结果;
    if(!\u propertyMap.TryGetValue(属性,输出结果))
    结果=假;
    返回结果;
    }
    设置{u propertyMap[property]=value;}
    }
    }
    
    然后您可以这样使用它:

    var annotatedCar = new AnnotatedObject<Car>(car);
    annotatedCar.IsCorrect["Power"] = true;
    
    var annotatedCar=新的AnnotatedObject(car);
    注释dcar.IsCorrect[“Power”]=true;
    
    我想到了这样的事,谢谢你的回答,我得考虑一下。