2013-04-10 59 views
18

说,我有一个类,美孚,看起来像这样:“System.Collections.Generic.IList <object>”不包含“添加”定义“动态”和“ExpandoObject”

public class Foo : IFoo 
{ 
    public Foo() 
    { 
     Bars = new List<dynamic>(); 
    } 
    public IList<dynamic> Bars { get; set; } 
} 

接口IFoo的样子:

public interface IFoo 
{ 
    IList<dynamic> Bars { get; set; } 
} 

现在,当我做到以下几点:

IFoo foo = new Foo(); 
dynamic a = new System.Dynamic.ExpandoObject(); 
a.Prop = 10000; 
dynamic b = new System.Dynamic.ExpandoObject(); 
b.Prop = "Some Text"; 
foo.Bars.Add(a); // Throws an 'System.Collections.Generic.IList<object>' does not contain a definition for 'Add' - exception!!!!! 
foo.Bars.Add(b); // Same here!!!!! 

我是什么在这里做错了吗?

+1

可能重复(http://stackoverflow.com/questions/7996491/cant-understand-the-exception-when- using-dynamic-with-generic-collection-in-ne) – 2013-04-10 10:10:05

+0

你会发布你得到的异常吗? – 2013-04-11 13:16:15

回答

21

这是一个已知的动态绑定issue

以下是一些变通方法。

使用ICollection<dynamic>代替:

void Main() 
{ 
    IFoo foo = new Foo(); 
    dynamic a = new System.Dynamic.ExpandoObject(); 
    a.Prop = 10000; 
    dynamic b = new System.Dynamic.ExpandoObject(); 
    b.Prop = "Some Text"; 
    foo.Bars.Add(a); 
    foo.Bars.Add(b); 
} 

public interface IFoo 
{ 
    ICollection<dynamic> Bars { get; set; } 
} 

public class Foo : IFoo 
{ 
    public Foo() 
    { 
     Bars = new List<dynamic>(); 
    } 

    public ICollection<dynamic> Bars { get; set; } 
} 

还是直线上升List<dynamic>

public interface IFoo 
{ 
    List<dynamic> Bars { get; set; } 
} 

public class Foo : IFoo 
{ 
    public Foo() 
    { 
     Bars = new List<dynamic>(); 
    } 

    public List<dynamic> Bars { get; set; } 
} 

或者使用dynamic foo

void Main() 
{ 
    dynamic foo = new Foo(); 
    dynamic a = new System.Dynamic.ExpandoObject(); 
    a.Prop = 10000; 
    dynamic b = new System.Dynamic.ExpandoObject(); 
    b.Prop = "Some Text"; 
    foo.Bars.Add(a); 
    foo.Bars.Add(b); 
} 

还是不动绑定add,通过转换成object

void Main() 
{ 
    IFoo foo = new Foo(); 
    dynamic a = new System.Dynamic.ExpandoObject(); 
    a.Prop = 10000; 
    dynamic b = new System.Dynamic.ExpandoObject(); 
    b.Prop = "Some Text"; 
    foo.Bars.Add((object)a); 
    foo.Bars.Add((object)b); 
} 

或使用像我即兴接口第三方框架,ActLike & Prototype Builder Syntax(中的NuGet)更有表现。

void Main() 
{ 
    dynamic New = Builder.New<ExpandoObject>(); 

    IFoo foo = Impromptu.ActLike(
        New.Foo(
         Bars: New.List(
           New.Obj(Prop:10000), 
           New.Obj(Prop:"Some Text") 
          ) 
         ) 
        ); 
} 

public interface IFoo 
{ 
    IList<dynamic> Bars { get; set; } 
} 
的[使用动态与.NET4泛型集合时无法理解的例外]
+0

谢谢嘘 - 这指出我在正确的方向:) – user1297653 2013-04-15 06:55:32

+0

非常感谢!我即将失去它。 – rpattabi 2013-08-28 10:35:31

2

我不知道这是否颠覆你的特殊的使用情况,但:

尝试明确铸造BarsSystem.Collections.IList

((System.Collections.IList)foo.Bars).Add(a); 

来源:https://stackoverflow.com/a/9468123/364

或者,只是重新定义你的接口+类Bars作为IList而非IList<dynamic>

相关问题