Avatar
makis824
Člen
Avatar
makis824:

Zdravim,

pokusam sa dynamicky vytvorit lambda-expression. Ako priklad som pouzil zdroj z MSDN - rozdiel je v tom, ze ja sa pokusam ako parameter vkladat objekt; priklad pada na 'Object does not match target type.' .

Nie je mi jasny ten 'target type' - je nutne pretypovat pParam ?

// dynamic lambda: p => p.age > 5
ParameterExpression pParam = Expression.Parameter(typeof(Person), "p");
ConstantExpression nConst1 = Expression.Constant(30, typeof(int));
PropertyInfo pInfo = typeof(Person).GetProperty("age");


Expression<Func<Person, bool>> lmb = Expression.Lambda<Func<Person, bool>>(Expression
    .GreaterThan(
        Expression.Constant((int)pInfo.GetValue(pParam, null)), // !! Object does not match target type.
        Expression.Constant(5)), new ParameterExpression[] { pParam });

MSDN Link

http://msdn.microsoft.com/…b397951.aspx?…

Za pomoc vopred dakujem..

 
Odpovědět 27.8.2014 12:22
Avatar
makis824
Člen
Avatar
Odpovídá na makis824
makis824:
IList<Person> ps = new List<Person> {
    new Person { name = "a", age = 20 },
    new Person { name = "b", age = 30 },
    new Person { name = "c", age = 40 }
};

// dynamic lambda: p => p.age > 20
var personParam = Expression.Parameter(typeof(Person), "p");
var numConst = Expression.Constant(20, typeof(int));
var age = Expression.Property(personParam, "age");

Expression<Func<Person, bool>> lmb = Expression.Lambda<Func<Person, bool>>(
    Expression.GreaterThan(age, numConst),
    personParam);

foreach (Person p in ps.Where(lmb.Compile()))
    Console.WriteLine(p.name);

Console.ReadKey();

..vid: http://stackoverflow.com/…here-example

 
Nahoru Odpovědět 27.8.2014 13:48
Avatar
sadlomaslox25:

pro slozitejsi vyrazy doporucuju pouzit nejakou knihovnu. osobne jich mam vyzkousenych asi 8 v jednom benchmarku a relativne nejlip vykonna a intuitivni me vysla https://github.com/…amicExpresso

 
Nahoru Odpovědět 27.8.2014 21:21
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.