プロパティとその値のリストがあり、次の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"
2つのクラスがあります。Person
文字列Name
とプリミティブ、および文字列プロパティを持つAge
複雑なAddress
クラスで構成されます。House
Street
City
State
基本的に私がやりたいことはPerson
、現在のアセンブリでクラスを検索し、そのインスタンスを作成し、クラスがどれほど複雑になっても、最も深いレベルでプリミティブ、文字列で構成されている限り、すべての値を割り当てることです、および などのいくつかの一般的な構造DateTime
。
トップレベルのプロパティを割り当てて、複雑なプロパティの1つに下げることができるソリューションがあります。これを解決するには再帰を使用する必要があると想定していますが、使用しないことをお勧めします。
ただし、再帰を使用しても、各プロパティにアクセスして値を割り当てる良い方法については途方に暮れています。
以下のこの例では、メソッドのパラメーターに基づいて、ドット表現をクラスに変換しようとしています。パラメータのタイプに基づいて適切なドット表現を検索し、一致するものを見つけようとします。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
}
}
}