假设我们有一个功能:
public IEnumerable<object> GetViewModel(int id) {
var records = LoadRecordById(id);
var result = (from record in records
select new {
field1 = record.data1,
field2 = record.data2,
....
}).ToArray();
return result;
}
我们可以像IEnumerable<object>
一样返回它,就像IEnumerable<dynamic>
一样。问题是:使用什么以及为什么?有什么优点/缺点?
答案 0 :(得分:3)
您现在有一个匿名类型。
如果将其投放到object
,则无法将字段输出。您无法将其强制转换为匿名对象(因为您不知道它是什么),并且您无法从object
访问这些属性。
如果将其强制转换为dynamic
,您可以像平常一样访问这些字段,但是您将失去所有类型的安全性。它将在编译时确定类型,这意味着您可以访问在编译时生成的类型,但如果输入错误,您将在运行时收到编译错误。
要做的最好的事情是创建一个具有所需属性的类,并返回该类的列表。然后你将获得属性,并将获得静态类型的好处。
答案 1 :(得分:1)
您应该使用接口或基类。但要回答你的问题:
dynamic foo = "Some string";
foo.ToUpper(); // this works fine
foo.Something(); // compiles, but runtime error
object bar = "Some string";
bar.ToUpper(); // does not compile