Byron Sommardahl
Byron Sommardahl

Reputation: 13012

How to convert the property selector in Expression<Func<MyClass, int>>?

I have the following expression type:

Expression<Func<MyClass, int>>

How can I convert it to a...

Expression<Func<MyClass, object>>

...and then back to a...

Expression<Func<MyClass, int>>

Upvotes: 3

Views: 1692

Answers (1)

Jon Skeet
Jon Skeet

Reputation: 1501926

I suspect you could just use Expression.Convert:

Expression<Func<MyClass, int>> original = ...;

var conversion = Expression.Lambda<Func<MyClass, object>>(
        Expression.Convert(original.Body, typeof(object)),
        original.Parameters);

var conversionBack = Expression.Lambda<Func<MyClass, int>>(
        Expression.Convert(conversion.Body, typeof(int)),
        original.Parameters);

EDIT: Okay, it looks like it works:

using System;
using System.Linq;
using System.Linq.Expressions;

class Test
{
    static void Main()
    {
        Expression<Func<string, int>> original = x => x.Length;
        var conversion = Expression.Lambda<Func<string, object>(
              Expression.Convert(original.Body, typeof(object)),
              original.Parameters);

        var conversionBack = Expression.Lambda<Func<string, int>>(
              Expression.Convert(conversion.Body, typeof(int)),
              original.Parameters);

        Console.WriteLine(conversion); // x => Convert(x.Length)
        Console.WriteLine(conversionBack); // x => Convert(Convert(x.Length))

        Console.WriteLine(conversion.Compile()("Hello")); // 5
        Console.WriteLine(conversionBack.Compile()("Hello")); // 5
    }
}

Upvotes: 5

Related Questions