Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to augment anonymous type object in C#

I often need to augment a object with a property for instance. Until now (tired of it ;) and it's ugly too) I have done it this way:

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

Is there a clever way to do this? What I have done previously is something like this:

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

I guess this could be done with some reflection, but I imagine there is a faster approach which makes something equivalent to the first cumbersome approach.

Thanks, Lasse

like image 823
Lasse Espeholt Avatar asked Oct 26 '10 17:10

Lasse Espeholt


2 Answers

No there is no support for appending new properties to an existing anonymous type. An anonymous type expression can only be used to create a brand new anonymous type with the specified properties. The two best alternatives for appending new properties are the ones listed in the question.

like image 89
JaredPar Avatar answered Sep 27 '22 21:09

JaredPar


I think what you are looking for is something like the ExpandoObject that was added in C# 4.0 along with the dynamic type

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

Internally it uses a dictionary so you can add/remove members dynamically. The first time you try to access a property like:

obj.NewProperty = newValue

the ExpandoObject will automatically add this to its internal dictionary.

Hope this helps.

like image 23
Roly Avatar answered Sep 27 '22 19:09

Roly