As you can read in Jon's post you need some object to store your variable. For MakePredicate
it will be created by compiler, for MakeDynamicPredicate
you'll have to do it yourself. First of all we need a class for variable value storage.
class someTestClass {
...
private class ValueHolder
{
public string Value;
}
...
}
Now you put your planetName
into an instance of the ValueHolder and make a Member Access expression for using it in your predicate expression.
private Predicate MakeDynamicPredicate(string planetName){
var valueHolder = new ValueHolder
{
Value = value
};
var valueExpr = Expression.MakeMemberAccess(
Expression.Constant(valueHolder),
valueHolder.GetType().GetField("Value"));
var parm = Expression.Parameter(typeof(planet), "p")
var pred = Expression.Lambda>(
Expression.ReferenceEqual(
Expression.Property(parm, typeof(planet), "name"),
valueExpr,
parm);
}
P.S. it often makes sense to take a look at the compiler generated code (e.g. with ILSpy) to better understand how various epxressions are created.