我们最近推出了一种全新的数据模型,从逻辑结构的角度来看,它与我们当前的模型不同。我们还将模型的语言从德语更改为英语,因为我们希望将模型结构作为XML打开给客户。
为了能够转换模型,我们实现了一个显式转换,它基本上将新模型的不同类中的所有属性匹配到旧模型中。
像这样:
private OldModel Convert(NewModel src)
{
var dst = new OldModel();
dst.Prop1 = src.SomeOtherProp
dst.Prop2 = Convert(src.ComplexProp);
//....
return dst;
}
现在我们要确保新模型的所有属性都写入旧模型以用于覆盖和测试目的。我们还希望确保我们不会忘记任何财产,并保证对于未来的模型扩展,我们不会忘记财产。
我的想法是解析代码文件,提取从新模型中读取的所有属性,在新模型上运行,并将反射与其中的实际属性进行比较。
这个解决方案感觉不像一个好的:-)有什么建议吗?
我感谢任何帮助!
答案 0 :(得分:0)
我建议使用像AutoMapper这样的映射库。它们允许配置映射,转换器以及使用公共属性和特定methods进行操作。
答案 1 :(得分:0)
我们最终决定用这样的正则表达式解析代码文件:
@"private static [a-zA-Z0-9.]+[ ]+Convert[(][^)]*[)]\s*[{](?<body>[^{}]*(((?<Open>[{])[^{}]*)+((?<Close-Open>[}])[^{}]*)+)*(?(Open)(?!)))[}]";
它将匹配此private static Namespace.ClassName Convert(Namespace.ClassName input)
之类的方法,并将提取方法体。
由于转换器方法遵循简单的结构模式,因此很容易提取我需要的信息。