作为我更大项目的一部分,我正在为网络开发一个解析器,根据预定义的规则,它将从网页获取数据并将其放入对象中。我使用.Net 4.0和SQL Server 2008在C#中编写。
想法是这样的:
假设我有一个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#中有这样的事情:(
答案 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;