Search Results for

    Show / Hide Table of Contents

    Class ExpressionTypeChanger<T>

    A class for traversing expressions and changing the type of a parameter from a type to another

    This is used by the system for Linq expressions generated against an interface and replacing them to work against the actual class implementation of that interface

    Inheritance
    object
    ExpressionVisitor
    ExpressionTypeChanger<T>
    Inherited Members
    ExpressionVisitor.Visit(Expression)
    ExpressionVisitor.Visit(ReadOnlyCollection<Expression>)
    ExpressionVisitor.Visit<T>(ReadOnlyCollection<T>, Func<T, T>)
    ExpressionVisitor.VisitAndConvert<T>(T, string)
    ExpressionVisitor.VisitAndConvert<T>(ReadOnlyCollection<T>, string)
    ExpressionVisitor.VisitBinary(BinaryExpression)
    ExpressionVisitor.VisitBlock(BlockExpression)
    ExpressionVisitor.VisitConditional(ConditionalExpression)
    ExpressionVisitor.VisitConstant(ConstantExpression)
    ExpressionVisitor.VisitDebugInfo(DebugInfoExpression)
    ExpressionVisitor.VisitDefault(DefaultExpression)
    ExpressionVisitor.VisitExtension(Expression)
    ExpressionVisitor.VisitGoto(GotoExpression)
    ExpressionVisitor.VisitInvocation(InvocationExpression)
    ExpressionVisitor.VisitLabelTarget(LabelTarget)
    ExpressionVisitor.VisitLabel(LabelExpression)
    ExpressionVisitor.VisitLambda<T>(Expression<T>)
    ExpressionVisitor.VisitLoop(LoopExpression)
    ExpressionVisitor.VisitIndex(IndexExpression)
    ExpressionVisitor.VisitMethodCall(MethodCallExpression)
    ExpressionVisitor.VisitNewArray(NewArrayExpression)
    ExpressionVisitor.VisitNew(NewExpression)
    ExpressionVisitor.VisitRuntimeVariables(RuntimeVariablesExpression)
    ExpressionVisitor.VisitSwitchCase(SwitchCase)
    ExpressionVisitor.VisitSwitch(SwitchExpression)
    ExpressionVisitor.VisitCatchBlock(CatchBlock)
    ExpressionVisitor.VisitTry(TryExpression)
    ExpressionVisitor.VisitTypeBinary(TypeBinaryExpression)
    ExpressionVisitor.VisitUnary(UnaryExpression)
    ExpressionVisitor.VisitMemberInit(MemberInitExpression)
    ExpressionVisitor.VisitListInit(ListInitExpression)
    ExpressionVisitor.VisitElementInit(ElementInit)
    ExpressionVisitor.VisitMemberBinding(MemberBinding)
    ExpressionVisitor.VisitMemberAssignment(MemberAssignment)
    ExpressionVisitor.VisitMemberMemberBinding(MemberMemberBinding)
    ExpressionVisitor.VisitMemberListBinding(MemberListBinding)
    ExpressionVisitor.VisitDynamic(DynamicExpression)
    object.GetType()
    object.MemberwiseClone()
    object.ToString()
    object.Equals(object)
    object.Equals(object, object)
    object.ReferenceEquals(object, object)
    object.GetHashCode()
    Namespace: LemonEdge.Utils
    Assembly: LemonEdge.Utils.dll
    Syntax
    public class ExpressionTypeChanger<T> : ExpressionVisitor
    Type Parameters
    Name Description
    T

    The type for the original expression

    Remarks

    See https://stackoverflow.com/questions/14932779/how-to-change-a-type-in-an-expression-tree for more details

    For example:

    public interface IMyItem
    {
        int Value { get; set; }
    }
    

    public class MyItem : IMyItem { public int Value { get; set; }

    public override string ToString() => Value.ToString();
    

    }

    public class Example { public IEnumerable<MyItem> ChangeType() { Expression<Func<IMyItem, bool>> expr = x => x.Value > 10; var newExpr = ExpressionTypeChanger<IMyItem>.Change<MyItem>(expr); var items = new List<MyItem>() { new MyItem() { Value = 5 }, new MyItem() { Value = 15 } }; return items.Where(newExpr.Compile()); } }

    Would return: 15

    Methods

    Change<TT>(Expression<Func<T, bool>>)

    Converts an expression from one type to another

    Declaration
    public static Expression<Func<TT, bool>> Change<TT>(Expression<Func<T, bool>> expr) where TT : T
    Parameters
    Type Name Description
    Expression<Func<T, bool>> expr

    The original expression to change the type of

    Returns
    Type Description
    Expression<Func<TT, bool>>

    A new expression with the type replaced

    Type Parameters
    Name Description
    TT

    The type to convert the original expression into

    Remarks

    For example:

    public interface IMyItem
    {
        int Value { get; set; }
    }
    

    public class MyItem : IMyItem { public int Value { get; set; }

    public override string ToString() => Value.ToString();
    

    }

    public class Example { public IEnumerable<MyItem> ChangeType() { Expression<Func<IMyItem, bool>> expr = x => x.Value > 10; var newExpr = ExpressionTypeChanger<IMyItem>.Change<MyItem>(expr); var items = new List<MyItem>() { new MyItem() { Value = 5 }, new MyItem() { Value = 15 } }; return items.Where(newExpr.Compile()); } }

    Would return: 15

    VisitMember(MemberExpression)

    This method is required because PersonData does not implement IPerson and it finds property in PersonData with the same name as the one referenced in expression and declared on IPerson

    Declaration
    protected override Expression VisitMember(MemberExpression node)
    Parameters
    Type Name Description
    MemberExpression node
    Returns
    Type Description
    Expression
    Overrides
    ExpressionVisitor.VisitMember(MemberExpression)

    VisitParameter(ParameterExpression)

    This method replaces original parameter with given in constructor

    Declaration
    protected override Expression VisitParameter(ParameterExpression node)
    Parameters
    Type Name Description
    ParameterExpression node
    Returns
    Type Description
    Expression
    Overrides
    ExpressionVisitor.VisitParameter(ParameterExpression)

    Extension Methods

    LinqExtensions.AsArray<T>(T)
    LinqExtensions.ToArrayOfOne<T>(T)
    LinqExtensions.ToListOfOne<T>(T)
    MiscExtensions.SetIfNotEqual<T, TP>(T, Expression<Func<T, TP>>, TP)
    WeakReferenceExtensions.WeakReference(object)
    SQLExtensions.ToSQLValue(object, bool)
    ReflectionExtensions.ClearEventInvocations(object, string)
    StringExtensions.ToCSVFormatString(object, Type)
    In this article
    Back to top © LemonEdge Technologies. All rights reserved.