匿名类型对象或动态

时间:2016-01-15 15:04:07

标签: c# linq

假设我们有一个功能:

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>一样。问题是:使用什么以及为什么?有什么优点/缺点?

2 个答案:

答案 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