除了LINQ查询,我们如何在C#中使用匿名类型?

时间:2020-03-06 15:05:21  来源:igfitidea点击:

我一直在努力加快Cand中的一些较新功能,其中一些我从未使用过的功能是匿名类型。

我了解与LINQ查询有关的用法,因此我看了这篇SO帖子,它询问了类似的问题。我在网上看到的大多数示例都与LINQ查询有关,这很酷。我也看到了一些人为的示例,但实际上并没有看到任何有价值的示例。

我们认为匿名类型确实为我们提供了一些实用工具吗?

解决方案

匿名类型最大的用途是LINQ,实际上这就是创建它的原因。

我想在linq之外使用匿名类型的一个原因是创建一个类似struct的临时对象,例如:

var x = new { a = 1, b = 2 };

在某些情况下,这可能会使生活更轻松一些。

ASP.NET MVC路由在各处都使用这些对象。

有时我怀疑执行类似LINQ查询的操作可能会有用,但是不会碰巧使用LINQ,但是我们仍然想要某种投影。我认为我不会以目前的形式使用匿名类型来处理与LINQ投影完全不同的任何事情。

我想看到的一件事是能够使用简单的声明创建"命名"类型,该类型将以与匿名类型相同的方式生成属性和构造函数,并在相同的位置覆盖Equals / GetHashCode / ToString(有用) 道路。然后,当需要增加更多行为时,可以将这些类型转换为"普通"类型。

再说一次,我认为我不会经常使用它,但是这种能力经常会派上用场,尤其是在一个类的几种方法中。这可能是为C5中的不可变类型提供更多支持的更大努力的一部分。

经过一点思考,我们可以将匿名类型转换为Dictionary <string,object>;。罗伊·奥什罗夫(Roy Osherove)在此博客他的技术博客:http://weblogs.asp.net/rosherove/archive/2008/03/11/turn-anonymous-types-into-idictionary-of-values.aspx

Jacob Carpenter使用匿名类型作为一种初始化不可变对象的方法,其语法类似于对象初始化:http://jacobcarpenter.wordpress.com/2007/11/19/named-parameters-part-2/

匿名类型可以用作为使用foreach语句迭代的集合中的对象的属性赋予易于理解的别名的方式。 (不过,老实说,这实际上仅是LINQ to Objects对匿名类型的标准使用。)例如:

Dictionary<int, string> employees = new Dictionary<int, string>
{
    { 1, "Bob" },
    { 2, "Alice" },
    { 3, "Fred" },
};

// standard iteration
foreach (var pair in employees)
    Console.WriteLine("ID: {0}, Name: {1}", pair.Key, pair.Value);

// alias Key/Value as ID/Name
foreach (var emp in employees.Select(p => new { ID = p.Key, Name = p.Value }))
    Console.WriteLine("ID: {0}, Name: {1}", emp.ID, emp.Name);

尽管这段简短的示例没有太大的改进,但是如果foreach循环更长,则引用IDName可能会提高可读性。

补充说到正义说,ASP.Net MVC是我第一次看到它们以有趣和有用的方式使用。这是一个例子:

Html.ActionLink("A Link", "Resolve", new { onclick = "someJavascriptFn();" })

ASP.Net MVC使用此类匿名类型将任意属性添加到HTML元素。我想我们可以通过多种不同的方式来完成同一件事,但是我喜欢匿名类型的简洁风格,它给人的感觉更像是一种动态语言。

我使用它们来做模板化电子邮件,因为如果我们使用反射和泛型,它们非常有用。

一些信息可以在这里找到:http://www.aaron-powell.com/blog.aspx?id=1247