2013-04-10 27 views
18

Nói rằng tôi có một lớp học, Foo, tìm một cái gì đó như thế này:'System.Collections.Generic.IList <object>' không chứa một định nghĩa cho 'Add' khi sử dụng 'năng động' và 'ExpandoObject'

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

các IFoo giao diện trông giống như:

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

Bây giờ, khi tôi làm như sau:

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!!!!! 

tôi gì làm sai ở đây ?????

+1

thể trùng lặp của [Không thể hiểu được những ngoại lệ khi sử dụng năng động với bộ sưu tập chung trong .net4] (http://stackoverflow.com/questions/7996491/cant-understand-the-exception-when- using-dynamic-with-generic-collection-in-ne) –

+0

Bạn có đăng ngoại lệ mà bạn đang nhận được không? –

Trả lời

21

Đây là liên kết động đã biết issue.

Dưới đây là một số công việc xung quanh.

Sử dụng ICollection<dynamic> thay vì:

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

Hoặc thẳng lên 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; } 
} 

Hoặc sử dụng 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); 
} 

Hoặc không năng động ràng buộc add, bằng cách đúc để 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); 
} 

Hoặc có biểu cảm hơn sử dụng một khung bên thứ ba như giao diện ngẫu hứng của tôi với ActLike & Prototype Builder Syntax (trong 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; } 
} 
+0

Cảm ơn bạn rất nhiều - điều này đã chỉ cho tôi đúng hướng :) – user1297653

+0

Cảm ơn rất nhiều! Tôi sắp mất nó. – rpattabi

2

Tôi không chắc chắn nếu điều này subverts trường hợp sử dụng cụ thể của bạn, nhưng:

Cố gắng đúc một cách rõ ràng Bars để System.Collections.IList.

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

Nguồn: https://stackoverflow.com/a/9468123/364

Ngoài ra, chỉ cần xác định lại Bars như IList hơn IList<dynamic> trong giao diện + lớp học của bạn.

Các vấn đề liên quan