2016-12-06 5 views
0

私はプロジェクトに取り組んでいると私は、次の操作を実行できるようにする必要があります。入れ子オブジェクトに値を動的に割り当てる方法は?

言って、私たちは、コンフィギュレーションクラスですAaクラスがあります。

public class Aa 
{ 
    public Bb BbName { set; get; } 
    public string Dd { set; get; } 
} 


public class Bb 
{ 
    public string bb { set; get; } 
    public string cc { set; get; } 
} 

を私は環境から変数を取得したいですそれらをそれぞれの特性に割り当てることができる。私が意味するところは:Environment.GetEnvironmentVariableのシミュレーションとして、Dictionary<string, string>を使用しましょう。 セットアップは次のようになります。

var dic = new Dictionary<string, string>(); 
dic.Add("Dd", "236.154"); 
dic.Add("BbName.bb", "value_for_Bb.bb"); // as you can see, I'm using nested object's full 
dic.Add("BbName.cc", "value_for_Bb.cc"); // path, in order to be able to identify it 

それから私はこのようになります方法、こう書いていますので、

private static void ReadPropertiesRecursive<T>(T obj, Type type, List<string> prefixes) 
{ 

    foreach (PropertyInfo property in type.GetProperties()) 
    { 
     if (property.PropertyType.GetTypeInfo().IsClass && property.PropertyType != typeof(string)) 
     { 
      prefixes.Add(property.Name); 
      ReadPropertiesRecursive(obj, property.PropertyType, prefixes); 
      prefixes.Remove(property.Name); 
     } 
     else 
     { 
      var propertyFullName = prefixes != null && prefixes.Count > 0 ? $"{prefixes.Aggregate((i, j) => i + "." + j)}.{property.Name}" : property.Name; 

      property.SetValue(obj, dic[propertyFullName]); 

      Console.WriteLine(propertyFullName); // just for debugging 
     } 
    } 
} 

を、再帰を使用して、私は与えられたすべてのネストされたオブジェクトに到達することができるよType残っているのは対応する値を割り当てることだけです。私はproperty.SetValue(obj, dic[propertyFullName]);でそれをやろうとしていますが、エラーが発生し、意味があります:objは、値を直接割り当てるオブジェクトではなく、「ルート」オブジェクトです。だから、おそらくobjではなく、propertyというインスタンス(objのプロパティ)をここに渡す必要があります。あれは正しいですか?それは働くだろうか?はいの場合、どうすればよいですか?トリックでし

+2

スプリットプロパティ名をあなたの関数を再帰的にする。 –

+0

これは私がやっていることです。私はそれを正しくやっています - 私は 'propertyFullName'を印刷するときにそれを見ることができるので、私は知っています。 – nicks

+0

ああ、あなたは**スプリット**プロパティの名前を言っている...申し訳ありませんが、私は正確に何を言っているか、それが私を助ける方法を理解していません。 – nicks

答えて

0

: "" で

private static void ReadPropertiesRecursive<Tt>(Tt obj, Type type, List<string> prefixes) 
{ 

    foreach (PropertyInfo property in type.GetProperties()) 
    { 
     if (property.PropertyType.GetTypeInfo().IsClass && property.PropertyType != typeof(string)) 
     { 
      prefixes.Add(property.Name); 
      var val = property.GetValue(obj); 
      if (val == null) 
       val = Activator.CreateInstance(property.PropertyType); 
      property.SetValue(obj, val); 
      ReadPropertiesRecursive(val, property.PropertyType, prefixes); 
      prefixes.Remove(property.Name); 
     } 
     else 
     { 
      var propertyFullName = prefixes != null && prefixes.Count > 0 ? $"{prefixes.Aggregate((i, j) => i + "." + j)}.{property.Name}" : property.Name; 

      property.SetValue(obj, dic[propertyFullName]); 

      Console.WriteLine(propertyFullName); 
     } 
    } 
} 
関連する問題