Skip to content

Instantly share code, notes, and snippets.

@oguimbal
Last active April 19, 2016 08:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save oguimbal/507f1a6e35981dddc50227970b388449 to your computer and use it in GitHub Desktop.
Save oguimbal/507f1a6e35981dddc50227970b388449 to your computer and use it in GitHub Desktop.
Expression to pretty string template
public static class ToStringExpressionVisitorExtensions
{
public static string ToPrettyString(this IQueryable @this)
{
var v = new ToStringExpressionVisitor();
v.Visit(@this.Expression);
return v.sb.ToString();
}
}
class ToStringExpressionVisitor : ExpressionVisitor
{
public StringBuilder sb = new StringBuilder();
protected override Expression VisitBinary(BinaryExpression node)
{
Visit(node.Left);
sb.Append(" ").Append(node.NodeType).Append(" "); // switch here to have prettier results
Visit(node.Right);
return node;
}
protected override Expression VisitMethodCall(MethodCallExpression node)
{
if(node.Method.DeclaringType == typeof(Queryable)){
// special case for .Where, .Select, etc ?
}
if (node.Object != null)
Visit(node.Object);
sb.Append(node.Method.Name).Append("(");
int x = 0;
foreach (var a in node.Arguments)
{
if (x++ > 0)
sb.Append(", ");
Visit(a);
}
sb.Append(")");
return node;
}
protected override Expression VisitLambda<T>(Expression<T> node)
{
if (node.Parameters.Count == 1)
sb.Append(Visit(node.Parameters[0]));
else
sb.Append("(").Append(string.Join(",", node.Parameters.Select(x => x.Name))).Append(")");
sb.Append(" => ");
Visit(node.Body);
return node;
}
protected override Expression VisitParameter(ParameterExpression node)
{
sb.Append(node.Name);
return node;
}
protected override Expression VisitMember(MemberExpression node)
{
Visit(node.Expression);
sb.Append(".").Append(node.Member.Name);
return node;
}
protected override Expression VisitConstant(ConstantExpression node)
{
var constant = node.Value;
if(constant is IEnumerable) // special case depending on constant type ?
{
}
if(constant is string)
{
sb.Append('"').Append(constant).Append('"');
}
sb.Append(constant == null ? "null" : constant.ToString());
return node;
}
protected override MemberBinding VisitMemberBinding(MemberBinding node)
{
// todo
return base.VisitMemberBinding(node);
}
protected override Expression VisitMemberInit(MemberInitExpression node)
{
// todo
return base.VisitMemberInit(node);
}
protected override Expression VisitNew(NewExpression node)
{
// todo
return base.VisitNew(node);
}
protected override Expression VisitNewArray(NewArrayExpression node)
{
// todo
return base.VisitNewArray(node);
}
protected override Expression VisitUnary(UnaryExpression node)
{
return base.VisitUnary(node);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment