Skip to content

Instantly share code, notes, and snippets.

@joshgo
Created January 9, 2014 19:11
Show Gist options
  • Save joshgo/8340083 to your computer and use it in GitHub Desktop.
Save joshgo/8340083 to your computer and use it in GitHub Desktop.
Playing around with expressions - Create a copy function
private Func<object, object> CreateInitFn(object obj)
{
var keyType = obj.GetType();
if (_initFn.ContainsKey(keyType))
{
return _initFn[keyType];
}
ParameterExpression xTmp = Expression.Variable(obj.GetType(), "tmp");
List<MemberBinding> memberBindings = new List<MemberBinding>();
foreach (var p in obj.GetType().GetProperties())
{
var binding = Expression.Bind(p, Expression.MakeMemberAccess(xTmp, p));
memberBindings.Add(binding);
}
var memberInit = Expression.MemberInit(Expression.New(obj.GetType()), memberBindings);
var lambda = Expression.Lambda<Func<object, object>>(memberInit, xTmp);
_initFn.Add(keyType, lambda.Compile());
return _initFn[keyType];
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment