是否有任何对象 - 对象映射器可以映射字典(或其他名称 - 值集合)中的属性?
假设我有课程
public class SomeClass
{
public string Text { get; set; }
public Address HomeAddress { get; set; }
public List<int> Numbers { get; set; }
}
public class Address
{
public string Street { get; set; }
public string PostalCode { get; set; }
public string City { get; set; }
}
我想做的是
var values = new Dictionary<string,object>();
values.Add("Text","Foo");
values.Add("HomeAddress.Street","Some street 123");
values.Add("HomeAddress.PostalCode","12345");
values.Add("HomeAddress.City","Some city");
values.Add("Numbers[0]",123);
values.Add("Numbers[1]",234);
values.Add("Numbers[2]",345);
SomeClass some = aMapperTool.CreateFromDictionary<SomeClass>(values);
这基本上类似于ASP.NET MVC中的DefaultModelBinder,它需要大量的上下文和元数据相关的东西,因此不太方便。
答案 0 :(得分:1)
您可以利用ComponentModel功能(这已在stackoverflow中的其他地方解决了
how to set nullable type via reflection code ( c#)?
using System.ComponentModel;
public void FillMeUp(Dictionary<string, string> inputValues){
PropertyInfo[] classProperties = this.GetType().GetProperties();
var properties = TypeDescriptor.GetProperties(this);
foreach (PropertyDescriptor property in properties)
{
if (inputValues.ContainsKey(property.Name))
{
var value = inputValues[property.Name];
property.SetValue(this,
property.Converter.ConvertFromInvariantString(value));
}
}
答案 1 :(得分:0)
为此,你不会绕过反射或表达树。
通过反思,大致如下:
T
details
中的键,如果需要,从中构建实际的属性名称(HomeAddress.Street
- &gt; HomeAdress
或Numbers[0]
- &gt; { {1}})。根据属性的类型(如果找到Number
,则需要先构造子对象,如果找到.
,则需要初始化[
。 / LI>
虽然这是一个可能的解决方案,但有一个问题在我脑海中浮现:“为什么?”