property generic dynamically create .net exception dynamic expandoobject

.net - generic - dynamicobject



''System.Collections.Generic.IList<object>'' no contiene una definiciĆ³n para ''Agregar'' cuando se usa ''dynamic'' y ''ExpandoObject'' (2)

Este es un conocido problema vinculante dinámico.

Aquí hay algunas soluciones alternativas.

Use ICollection<dynamic> lugar:

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

O directamente en la 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; } }

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

O no add enlace dinámico, lanzando al 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); }

O sea más expresivo utilizando un marco de terceros como mi interfaz improvisada con ActLike & Prototype Builder Syntax (en 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; } }

Digamos que tengo una clase, Foo, que se ve así:

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

La interfaz IFoo se ve así:

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

Ahora, cuando hago lo siguiente:

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

¿¿¿¿¿Qué estoy haciendo mal aquí?????


No estoy seguro si esto subvierte su caso de uso particular, pero:

Intente emitir Bars explícitamente a System.Collections.IList .

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

Fuente: https://.com/a/9468123/364

Alternativamente, simplemente redefina Bars como IList lugar de IList<dynamic> en su interfaz + clase.