【问题标题】:How to assign values to the nested objects dynamically?如何动态地为嵌套对象赋值?
【发布时间】: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


【解决方案1】:

成功了:

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);
        }
    }
}

【讨论】:

    猜你喜欢
    • 2015-10-22
    • 2020-01-26
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 2023-02-25
    • 2019-06-26
    • 2019-07-15
    • 2016-04-29
    相关资源
    最近更新 更多