gpt4 book ai didi

.net - 'System.Collections.Generic.IList' does not contain a definition for ' Add' 当使用 'dynamic' 和 'ExpandoObject'
转载 作者:行者123 更新时间:2023-12-03 12:43:35 35 4
gpt4 key购买 nike

假设我有一个类(class) Foo,看起来像这样:

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

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

最佳答案

这是一个已知的动态绑定(bind) 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);
}

或者不要动态绑定(bind)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中)。
using ImprmoptuInterface;
using Dynamitey;
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; }
}

关于.net - 'System.Collections.Generic.IList<object >' does not contain a definition for ' Add' 当使用 'dynamic' 和 'ExpandoObject',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15920844/

35 4 0