C# POCOs的某种注释
作为我更大项目的一部分,我正在为web开发一个解析器,根据预定义的规则,它将从web页面获取数据并将其放入对象中。我使用.NET4.0和SQLServer2008用C#编写 这个想法是这样的: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)。 我为解析器创建
var annotatedCar = new AnnotatedObject<Car>(car);
annotatedCar.IsCorrect["Power"] = true;
假设我有一个Car{Power,Weight,Price}
对象(EF中用于存储数据的POCO)。
我为解析器创建规则,所以当它扫描某个站点时,它将尝试填充对象的属性
例如:Car{Power=100Hp,Weight=1000kg,Price=7000$}
所有这些都在起作用。但是,由于所有站点都不同,甚至在一个站点上,数据的结构也可能不同,因此我需要某种方法来验证我的解析规则
我想创建一个测试程序,它将:
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;
我想到了这样的事,谢谢你的回答,我得考虑一下。