What I want to do is take any class type and create a list of ‘get’ accessors to all of the properties in the object graph.
The exact format, order, etc of the collection doesn’t matter, I just don’t quite know how to start off identifying and creating accessors to all of the properties. It might take the form of something like this:
public static List<Func<T,object>> CreateAccessors<T>()
{
Type t = typeof(T);
// Identify all properties and properties of properties (etc.) of T
// Return list of lambda functions to access each one given an instance of T
}
public void MyTest()
{
MyClass object1;
var accessors = CreateAccessors<MyClass>();
var myVal1 = accessors[0](object1);
var myVal2 = accessors[1](object1);
// myVal1 might now contain the value of object1.Property1
// myVal2 might now contain the value of object1.Property4.ThirdValue.Alpha
}
You can use reflection to extract the properties and expression-trees to help build the delegates targeting the property getters:
Note that although
Delegate.CreateDelegateseems like an obvious choice, you will have some problems boxing value-type properties. Expression-trees dodge this problem elegantly.Note that you’ll need some more work to be able to get “nested” properties out too, but hopefully I’ve given ypu enough to get you started (hint: recurse). One final pointer with that: watch out for cycles in the object graph!