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原则。