我有一个属性列表及其值,它们的格式Dictionary<string, object>
如下:
Person.Name = "John Doe"
Person.Age = 27
Person.Address.House = "123"
Person.Address.Street = "Fake Street"
Person.Address.City = "Nowhere"
Person.Address.State = "NH"
有两个班。Person
由字符串Name
和基元Age
以及具有、、和字符串属性的复杂Address
类组成。House
Street
City
State
基本上我想做的是Person
在当前程序集中查找类并创建它的一个实例并分配所有值,无论类变得多么复杂,只要在最深层次上它们是由原语、字符串组成的,以及一些常见的结构,例如DateTime
.
我有一个解决方案,它允许我将顶级属性分配到一个复杂的属性中。我假设我必须使用递归来解决这个问题,但我不希望这样做。
虽然,即使使用递归,我也不知道有一种很好的方法可以深入了解每个属性并分配它们的值。
在下面的这个例子中,我试图根据方法的参数将虚线表示转换为类。我根据参数的类型查找适当的虚线表示,试图找到匹配项。DotField
基本上是一个KeyValuePair<string, object>
关键是Name
属性的地方。下面的代码可能无法正常工作,但它应该能很好地表达这个想法。
foreach (ParameterInfo parameter in this.method.Parameters)
{
Type parameterType = parameter.ParameterType;
object parameterInstance = Activator.CreateInstance(parameterType);
PropertyInfo[] properties = parameterType.GetProperties();
foreach (PropertyInfo property in properties)
{
Type propertyType = property.PropertyType;
if (propertyType.IsPrimitive || propertyType == typeof(string))
{
string propertyPath = String.Format("{0}.{1}", parameterType.Name, propertyType.Name);
foreach (DotField df in this.DotFields)
{
if (df.Name == propertyPath)
{
property.SetValue(parameterInstance, df.Value, null);
break;
}
}
}
else
{
// Somehow dive into the class, since it's a non-primitive
}
}
}