返回首页


已NET 3.5在C#是一个方便而强大功能,可用于简化和加快发展不牺牲代码的质量,或违反编码标准。也许最广为人知的应用在LINQ表达式中使用匿名类型,因为这是MSDN上提到的大多数匿名类型相关的例子。这种匿名类型和LINQ之间的强烈关联,虽然真实的LINQ创建一个错误的印象,是唯一的应用程序匿名类型可能阻碍许多开发商发现许多其他方式利用匿名类型。例如,我可以提回匿名类型的对象时,WCF的JSON启用ASP.NET网页或MVC服务方法,这是非常有益的因匿名类型是非常轻量级的和现成的JSON序列化。不过这是另一篇文章的主题。
匿名类型,当考虑其适用性经常拒绝使用,由于其局部范围知名度,通常被认为是一个牢不可破障碍。这意味着什么,是一个匿名类型的对象只能使用它被定义方法范围最大范围内的代码范围。换句话说,一个匿名类型的对象不能被用来作为其能见度范围以外的强类型的对象,因为它的类型不存在在外部范围从编译器的角度来看。例如,如果从方法返回一个匿名对象,它只能被视为和作为基地C#对象类型,这使得它完全无用的,因为它的属性及其值从传统的观点来看是不可访问的。编译器会抛出一个错误一个匿名类型对象转换到其他任何类型的任何企图。基于以上将是显而易见的结论无法继续沿着这条道路,并考虑关闭主题。然而这是不正确的。
在C网名为{A} 4#另一个强大的功能,匿名类型给出了更要使用的,因为他们现在可以使用他们的能见度范围之外的原因。听起来很奇妙?让我告诉你它是如何做。
让我们考虑通常情况下,当有一个复杂的对象作为数据源使用的长长的名单,我们需要选择几个对象该名单,并显示它们的一些性质。旧学校的做法是定义的POCO类型,包括物业显示,遍历原始清单和人口从数据源属性的POCO对象建立一个新的列表,然后结合该名单POCO的对象到一个可视化的控制,显示输出。什么是错的,只是一个新的POCO类型必须定义,即使它不会其他地方被重用。这需要额外的编码,如果应显示的内容变化,未来的维护。与匿名类型我们可避免,而不是使用一个匿名类型提供了一个匿名对象作为数据源的可视化控制列表创建的POCO类型。这将对匿名对象名单就好了,只要没有额外的数据处理工作。往往但是它需要执行一些额外的处理对一个新建的数据源,这是一个列表或匿名对象,这是哪里出了问题的发生是不可能匿名对象以外的地方创建此对象的方法来访问属性。是真正尽管吗?
动态关键字可以克服这个问题,因为它指示编译器不执行编译时类型检查和离开,运行时间环境。因此,我们可以写一个匿名对象的工作,因为它是一个强类型对象的C#代码。见下面的代码示例:

object[] GetList()

{

 // Elements is a long list of complex objects

 var result = new ArrayList();

 foreach (var element in Elements)

 {

  if (/*condition to select a single element */)

  {

   result.Add(new { P1 = elemet.Prop1, 

          P2 = element.Prop2, P3 = element.Prop3 });

  }

 }

 return result.ToArray();

}



// Note: input parameter el is declared as dynamic

void ProcessElement(dynamic el)

{

 // Cool! For a dynamic type compiler allows accessing properties by names

 var p1 = el.P1;

 var p2 = el.P2;

 var p3 = el.P3;

 // Now we can do something that we need with an anonymous object!

}



void PerformLogic()

{

 var list = GetList();

 foreach (var element in list)

 {

  ProcessElement(element);

 }

 // do something else...

}

我假设意见的例子,因为它本身就说明了。刚刚尝试和使用这个很酷的技术,在你的下一个项目看到你节省多少时间和头痛。
只是重申:匿名类型是一个强大的功能,有助于创造更清洁,更好的代码,但它有一定的局限性。使用dynamic关键字,可以克服匿名类型的限制。

回答

评论会员: 时间:2