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