【发布时间】:2017-04-20 16:58:42
【问题描述】:
我正在做一个项目,我需要能够做到以下几点:
说,我们有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 的属性。那是对的吗?那会奏效吗?如果是,我应该怎么做?
【问题讨论】:
-
用“.”分割属性名并使您的函数递归。
-
这就是我正在做的事情,而且我做得对 - 我知道,因为我可以在打印出
propertyFullName时看到它。 -
啊,你说的是 split 属性名称...对不起,我不明白你到底在说什么或者它对我有什么帮助。
-
在我使用电脑前几个小时,如果其他人没有,我会发布一些内容。
标签: c# .net dynamic-programming