在下面的代码中使用动态类型有什么好处?
public static List<dynamic> GetEmployees()
{
List<Employee> source = GenerateEmployeeCollection();
var queyResult = from employee in source
where employee.Age > 20
select new { employee.FirstName, employee.Age };
return queyResult.ToList<dynamic>();
}
你什么时候去找回名单。
是否要避免创建很少使用的类型?
答案 0 :(得分:4)
如果您正在进行查询,并且只在您的方法中使用结果,则使用匿名类型非常有用。
在这种情况下,您将从方法返回数据。从方法返回数据时,您希望消费者确切地知道期望的内容(他们显然不会使用动态类型)。因此,使用动态类型肯定不是一个好主意。
答案 1 :(得分:3)
这显然是对dynamic
关键字的误用 - 它应仅用于在编码时无法定义类型的对象实例(例如与Python等动态语言交互时的情况) 。作者太懒了,无法定义他可以从方法返回的类型。
相反,上面的代码应改为:
public class Person
{
public string FirstName { get; private set; }
public int Age { get; private set; }
public Person(string firstName, int age)
{
FirstName = firstName;
Age = age;
}
}
...
public static List<Person> GetEmployees()
{
List<Employee> source = GenerateEmployeeCollection();
var queyResult = from employee in source
where employee.Age > 20
select new Person(employee.FirstName, employee.Age);
return queyResult.ToList();
}
关于ToList():对ToList()
的调用是有意义的,因为它“实现”了前一个LINQ查询的结果。否则,查询将推迟执行直到实际迭代 - 这在上述情况下通常是不可取的(但请注意,您可以在此处删除类型参数,无论如何都是由编译器推断的。)
答案 2 :(得分:2)
方法无法返回匿名类型(这是您使用new { employee.FirstName, employee.Age }
创建的)。使用dynamic
会绕过此问题。
我不建议以这种方式使用dynamic
:要么返回Employee
,要么只使用这些属性创建另一种类型。主要原因是dynamic
没有明确告诉那些使用GetEmployees
的人可用的属性。它还具有较小的运行时性能,因为它必须在运行时解析属性名称。
答案 3 :(得分:2)
如果此方法不是公共API的一部分,并且仅由您或您的开发人员使用,则可以使用Tuple类。
public static List<Tuple<string, int>> GetEmployees()
{
List<Employee> source = GenerateEmployeeCollection();
var queyResult = from employee in source
where employee.Age > 20
select Tuple.Create(employee.FirstName, employee.Age);
return queyResult.ToList();
}
然后按如下方式访问值
var emps = GetEmployees();
var firstEmpName = emps[0].Item1; // FirstName
var firstEmpage = emps[0].Item2; // Age
我不建议将其用作公共API的一部分,因为不清楚哪个项目包含什么价值。但是,出于私人使用的缘故,这是获取数据临时类的好方法。