使用LINQ的动态类型

时间:2014-01-10 16:06:36

标签: c# linq

在下面的代码中使用动态类型有什么好处?

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>();
}

你什么时候去找回名单。

是否要避免创建很少使用的类型?

4 个答案:

答案 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的一部分,因为不清楚哪个项目包含什么价值。但是,出于私人使用的缘故,这是获取数据临时类的好方法。