从列表的元素创建c#动态对象

时间:2016-05-17 23:59:35

标签: c#

如何转换: 清单:

var list = new List<string>(){"str1","str2"}

匿名对象:

var anonymousObject = new {str1 = "str1",str2 = "str2"}

在运行时

2 个答案:

答案 0 :(得分:0)

您可以使用ExpandoObject,它将为您提供动态类型的功能。

        var list = new List<string>() { "str1", "str2" };
        ExpandoObject obj = new ExpandoObject();
        var store = (IDictionary<string, object>)obj;

        list.ForEach(x => store.Add(x, x));

        dynamic lst  = obj;
        var val = lst.str1; // Test

答案 1 :(得分:0)

您还可以使用下面所示的扩展方法(来自here)。

因为在应用程序中存在许多这样的情况时,通过手动迭代项目将列表转换为动态对象会很痛苦。

您可以像这样使用此扩展方法:

  dynamic list = new List<string>() { "str1", "str2" }
       .ToDictionary(dd => dd, dd => (object)dd)
       .ToExpando();

扩展方法:

    public static ExpandoObject ToExpando(this IDictionary<string, object> dictionary)
    {
        var expando = new ExpandoObject();
        var expandoDic = (IDictionary<string, object>)expando;

        // go through the items in the dictionary and copy over the key value pairs)
        foreach (var kvp in dictionary)
        {
            // if the value can also be turned into an ExpandoObject, then do it!
            if (kvp.Value is IDictionary<string, object>)
            {
                var expandoValue = ((IDictionary<string, object>)kvp.Value).ToExpando();
                expandoDic.Add(kvp.Key, expandoValue);
            }
            else if (kvp.Value is ICollection)
            {
                // iterate through the collection and convert any strin-object dictionaries
                // along the way into expando objects
                var itemList = new List<object>();
                foreach (var item in (ICollection)kvp.Value)
                {
                    if (item is IDictionary<string, object>)
                    {
                        var expandoItem = ((IDictionary<string, object>)item).ToExpando();
                        itemList.Add(expandoItem);
                    }
                    else
                    {
                        itemList.Add(item);
                    }
                }

                expandoDic.Add(kvp.Key, itemList);
            }
            else
            {
                expandoDic.Add(kvp);
            }
        }

        return expando;
    }