10

我试图在 c# 中使用 DynamicObject,我需要一个动态数组:

var d = new dynamic[];

效果很好。

编辑:见下面的 ExpandoObject。

但我也喜欢用这种压缩的初始化新语法填充该数组:

var d = new dynamic[] { 
  new {
   Name = "Some",
   Number = 1010
  },
  new {
   Name = "Other",
   Number = 2010
  }
 }

但在这种情况下,所有对象都获得非动态类型“对象”,并且通过项目循环会给我一个例外:

foreach (dynamic item in d)
{
  @item.Name
  @item.Number
}

错误:“对象”不包含“名称”的定义。我想我只是以错误的方式初始化数组项。如何改为添加动态对象?

编辑:新内容:

我意识到“动态”没有动态添加属性的能力。

我最好使用 ExpandoObject ,它将内部字典中的所有项目作为属性公开。但不幸的是 ExpandoObject 似乎不支持这种很好的压缩创建语法,编译器抱怨:

var d = new ExpandoObject[]{
new ExpandoObject(){
    Name="Nnn",
    Number=1080
    }
}

所以答案可能只是:这是不可能的。

4

3 回答 3

10

希望你真的不需要动态

class Program
{
    static void Main(string[] args)
    {
        var d = new[]
                    {
                        new
                            {
                                Name = "Some",
                                Number = 1010
                            },
                        new
                            {
                                Name = "Other",
                                Number = 2010
                            }
                    };
        foreach (var item in d)
        {
            string s = @item.Name;
            int n = @item.Number;
            Console.WriteLine("{0} {1}", s, n);
        }
    }
}
于 2011-01-26T14:45:01.000 回答
7

我来晚了,但这是我发现的:

如果我不能初始化一个 ExpandoObject,用动态类型初始化它怎么样?

所以我做了以下扩展方法

    public static ExpandoObject CreateExpando(this object item)
    {

        var dictionary = new ExpandoObject() as IDictionary<string, object>;
        foreach (var propertyInfo in item.GetType().GetProperties())
        {
            dictionary.Add(propertyInfo.Name, propertyInfo.GetValue(item, null));
        }
        return (ExpandoObject)dictionary;
    }

我知道这远非理想,但这是我目前能达到的最好水平,它的工作原理是这样的:

var myExpandoObject = new { Name="Alex", Age=30}.CreateExpando();
于 2011-09-14T08:52:39.890 回答
1

开源框架Impromptu-Interface具有与 ExpandoObject 一起使用的压缩初始化语法。

dynamic @new = Builder.New<ExpandoObject>();

var d = @new.List( 
  @new.Expando(
   Name:"Some",
   Number: 1010
  ),
  @new.Expando(
   Name:"Other",
   Number: 2010
  )
 );
于 2011-04-21T03:07:02.407 回答