Last active
April 19, 2016 08:44
-
-
Save oguimbal/507f1a6e35981dddc50227970b388449 to your computer and use it in GitHub Desktop.
Expression to pretty string template
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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