正如其他人提到的那样,这种情况很常见,并且肯定需要从更好的角度解决它的上下文,因为我怀疑代码库的架构不好。尽管如此,您的问题仍然有效。要解决它,您至少有两种可能性:
1.需要开发时间;运行时可忽略不计的时间- 只需创建一个函数,将给定字典映射到您的类的实例。例子:
Foo MapDictionaryToFoo(IReadOnlyDictionary<string, dynamic> d)
{
return new Foo
{
ID1 = d[nameof(Foo.ID1)],
ID2 = d[nameof(Foo.ID2)],
ID3 = d[nameof(Foo.ID3)]
};
}
调用示例:
Foo myFoo = MapDictionaryToFoo(myDictionary);
2.需要运行时间;可忽略的开发时间- 创建一个将给定字典映射到任意类的函数,通常使用反射。下面的示例假定您的类具有默认构造函数,因此也充当工厂。如果不是这种情况,则可以在附加参数中传递现有实例:
T CreateFromDictionary<T>(IReadOnlyDictionary<string, dynamic> d) where T : new()
{
T obj = new T();
foreach (var propertyInfo in typeof(T).GetProperties())
{
propertyInfo.SetValue(obj, d[propertyInfo.Name]);
}
return obj;
}
调用示例:
Foo myFoo = CreateFromDictionary<Foo>(myDictionary);
如果我必须选择一个,我会选择第一种方法,因为我避免了任何反射,这在运行时很耗时。