using System.Collections.Generic;
using System.Linq.Expressions;
public static void Main()
var test = new Test() { Foo = "woop", Bar = 3 };
var expr = CreatePropertyDict(typeof(Test));
public static Func<object, Dictionary<string, object>> CreatePropertyDict(Type type)
var dictType = typeof(Dictionary<string, object>);
var dictCtor = dictType.GetConstructor(new[] { typeof(int) });
var properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
var dictAddMethod = dictType.GetMethod("Add");
var blockExpressions = new List<Expression>();
var inputParameter = Expression.Parameter(typeof(object), "input");
var dVariable = Expression.Variable(type, "d");
blockExpressions.Add(Expression.Assign(dVariable, Expression.Convert(inputParameter, type)));
var dictVariable = Expression.Variable(dictType, "dict");
blockExpressions.Add(Expression.Assign(dictVariable, Expression.New(dictCtor, Expression.Constant(properties.Length))));
foreach (var property in properties)
var propertyAccess = Expression.Property(dVariable, property);
blockExpressions.Add(Expression.Call(
Expression.Constant(property.Name),
Expression.Convert(propertyAccess, typeof(object))));
blockExpressions.Add(dictVariable);
var block = Expression.Block(new[] { dVariable, dictVariable }, blockExpressions);
return Expression.Lambda<Func<object, Dictionary<string, object>>>(block, inputParameter).Compile();
public string Foo { get; set; }
public int Bar { get; set; }