如何在C#中扩充匿名类型对象

时间:2010-10-26 17:24:20

标签: c# linq anonymous-types

我经常需要使用属性来扩充对象。直到现在(厌倦了它;)它也很丑陋)我这样做了:

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

我想这可以通过一些反思来完成,但我想有一种更快的方法可以使某些东西等同于第一种繁琐的方法。

谢谢,Lasse

2 个答案:

答案 0 :(得分:4)

不支持将新属性附加到现有匿名类型。匿名类型表达式只能用于创建具有指定属性的全新匿名类型。附加新属性的两个最佳替代方案是问题中列出的方法。

答案 1 :(得分:3)

我认为你要找的东西就像是在C#4.0中添加的ExpandoObject以及动态类型

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

在内部,它使用字典,因此您可以动态添加/删除成员。您第一次尝试访问以下属性时:

obj.NewProperty = newValue

ExpandoObject会自动将其添加到其内部字典中。

希望这有帮助。