I've got some plain-old classes with a bunch of simple properties (simple {get; set;}
declarations). All the properties are nullable (or equivalently, reference types).
For example:
class POCO
{
int? Field1 { get; set; }
string Field2 { get; set; }
... etc ...
}
I've got a scenario where I'm building these POCOs piecemeal, and at the end I'd like to get one of them with all the non-null fields.
Some illustrative code:
POCO o1 = LoadFields1To3();
POCO o2 = LoadFields4To5();
POCO o3 = LoadFields6To9();
... etc ...
We're in this scenario because some of the fields are loaded from SQL (and sometimes distinct queries), while some are loaded from in memory data structures. I'm re-using the POCO type here to avoid a bunch of otherwise pointless classes (a static type being quite useful for Dapper, and just in general).
What I'm looking for is a nice way to coalesce these objects' properties into a single one with the non-null properties.
Something like:
POCO final = o1.UnionProperties(o2).UnionProperties(o3) // and so on
I am able to guarantee that no field is non-null on more than one object. Though I'd assume a solution would take the left-most non-null field, it's not actually necessary.
I know I can write some reflection code to do this, but it's a bit nasty and slow.
This does need to be generically applicable, as while I never intend to coalesce objects of different types, there are a very large number of types that this method would be applicable to.
I was wondering if there isn't some cleverer way, perhaps abusing dynamic?
I gather (ok, I asked you) that the key objectives here are:
The following uses meta-programming to do whatever it can on the fly at runtime, compiling itself to a typed delegate (
Action<POCO, POCO>
) for efficient re-use: