2010-10-26 36 views
5

我经常需要用一个属性来扩充对象。 ;到现在为止(厌倦了),它的丑陋太)我已经这样做了:如何在C中增加匿名类型对象#

var someListOfObjects = ...; 

var objectsWithMyProperty = from o in someListOfObjects 
          select new 
          { 
           o.Name, /* Just copying all the attributes I need */ 
           o.Address, /* which may be all of them. */ 

           SomeNewProperty = value 
          }; 

有一个聪明的办法做到这一点?我以前做的是这样的:

var objectsWithMyProperty = from o in someListOfObjects 
          select new 
          { 
           OldObject = o,   /* I access all of the old properties from here */  
           SomeNewProperty = value 
          }; 

我想这可能与一些反射来实现,但我想有一个更快的方法,这使得一些相当于第一繁琐的方法。

感谢,拉塞

+0

我想你可以拿出一个奇特的表达树。但它可能不适用于Linq2SQL和朋友。 – leppie 2010-10-26 17:27:57

+0

第二种方法有什么问题? – 2010-10-26 17:28:58

+0

@Pieter我认为它是丑陋的,并且在我使用它的上下文中没有意义。如果您将它作为一个数据源提供给Eval(“WhyDoIHaveToHaveANameHere.TheActualProperty”)',那么Fx。 – 2010-10-26 19:51:12

回答

3

我想你在找什么是类似的东西在C#4.0以及动态类型

http://msdn.microsoft.com/en-us/magazine/ff796227.aspx

内部它使用一本字典,所以你可以添加/动态删除成员加入的ExpandoObject。当您第一次尝试访问的属性,如:

obj.NewProperty = newValue 

的ExpandoObject会自动将它添加到它的内部字典。

希望这会有所帮助。

+0

现在你提到'ExpandoObject'我记得我有你链接到的杂志。我会更喜欢静态解决方案,但动态比没有更好:)谢谢... – 2010-10-27 18:42:28

4

不存在对追加新的属性到现有的匿名类型的支持。匿名类型表达式只能用于创建具有指定属性的全新匿名类型。附加新属性的两个最佳选择是问题中列出的。

+0

这太糟糕了:(谢谢...... :) – 2010-10-26 19:51:39