Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 匿名类型对象或动态_C#_Linq - Fatal编程技术网

C# 匿名类型对象或动态

C# 匿名类型对象或动态,c#,linq,C#,Linq,假设我们有一个函数: public IEnumerable<object> GetViewModel(int id) { var records = LoadRecordById(id); var result = (from record in records select new { field1 = record.data1,

假设我们有一个函数:

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

您现在有一个匿名类型

如果将其强制转换为对象,则无法将字段取出。您无法将其强制转换回匿名对象,因为您不知道它是什么,并且无法从该对象访问属性

如果将其强制转换为dynamic,则可以像平常一样访问字段,但会失去所有类型安全性。它将在编译时确定类型,这意味着您可以访问在编译时生成的类型,但是如果您键入了错误的内容,则在运行时会出现编译错误


最好的方法是创建一个具有所需属性的类,并返回该类的列表。然后您将获得属性,并将获得静态类型的好处。

您现在有一个匿名类型

如果将其强制转换为对象,则无法将字段取出。您无法将其强制转换回匿名对象,因为您不知道它是什么,并且无法从该对象访问属性

如果将其强制转换为dynamic,则可以像平常一样访问字段,但会失去所有类型安全性。它将在编译时确定类型,这意味着您可以访问在编译时生成的类型,但是如果您键入了错误的内容,则在运行时会出现编译错误


最好的方法是创建一个具有所需属性的类,并返回该类的列表。然后您将获得属性,并将获得静态类型的好处。

您应该使用接口或基类。但要回答你的问题:

dynamic foo = "Some string";
foo.ToUpper(); // this works fine
foo.Something(); // compiles, but runtime error

object bar = "Some string";
bar.ToUpper(); // does not compile

您应该使用接口或基类。但要回答你的问题:

dynamic foo = "Some string";
foo.ToUpper(); // this works fine
foo.Something(); // compiles, but runtime error

object bar = "Some string";
bar.ToUpper(); // does not compile

复制研究一下对象和动态之间的区别,你就有了答案。考虑创建一个命名类型而不是匿名类型是这样使用的。IMHO创建一个接口或一个基类;这违反了基本的OO原则。重复?研究一下对象和动态之间的区别,你就有了答案。考虑创建一个命名类型而不是匿名类型是这样使用的。IMHO创建一个接口或一个基类;这违反了基本的OO原则。