Get DateTime value From FieldInfo

295 Views Asked by At

I am tryning to retrieve a DateTime via reflection. The value is not inside a class or a static class, but it is from a lambda expression...

I have this really simple lambda expression: ATest => ATest.MyDate == DateTime.Now

Now, via an ExpressionVisitor I am trying getting datetime value:

public class ExpressionComparionsVisitor : ExpressionVisitor
{
    public Expression Modify(Expression expression)
    {
        return base.Visit(expression);
    }


    protected override Expression VisitMember(MemberExpression node)
    {
        if (node.NodeType == ExpressionType.MemberAccess)
        {
            if (node.Member.MemberType == System.Reflection.MemberTypes.Field)
            {
                if (node.Type ==  typeof(DateTime))
                {
                    System.Reflection.FieldInfo fieldInfo = node.Member as System.Reflection.FieldInfo;

                    if (fieldInfo != null)
                    {
                        //Here what I have tried, but no success

                        //var n = (DateTime)fieldInfo.GetValue(fieldInfo);
                        //var n = (DateTime)fieldInfo.GetValue(typeof(DateTime));
                        //var n = (DateTime)fieldInfo.GetValue(node.Member);
                        //var n = (DateTime)fieldInfo.GetValue(null);
                    }
                }
            }
        }
            return base.VisitMember(node);
    }
}

How can I get the DateTime value of that field? Thank you

1

There are 1 best solutions below

2
Guru Stron On

In short you can't. Your lambda ATest => ATest.MyDate == DateTime.Now represents a function that accepts a parameter (ATest) and returns boolean based on equality ATest.MyDate to DateTime.Now, so the value of ATest.MyDate can different for different provided inputs. To get some concrete value you need to provide some concrete input:

class MyClass {public DateTime MyDate;}

var someVal = new MyClass { MyDate = new DateTime(2020, 01, 01) };
Expression<Func<MyClass, bool>> expr = ATest => ATest.MyDate == DateTime.Now;
var node = (expr.Body as BinaryExpression).Left as MemberExpression;
var fi = node.Member as FieldInfo;
Console.WriteLine(fi.GetValue(someVal)); // prints 1 January of 2020 in corresponding format