(Toto byl originál poskytnutý předtím, než jsme si uvědomili, že reflexe by v tomto konkrétním případě nepomohla. Aktualizovanou odpověď naleznete v úpravě níže)
Pokud vám nevadí používat reflexi, můžete:
var data = db.Single<Demo>(d => "value" == (string)typeof(Demo).GetProperty(propname).GetValue(d));
UPRAVIT
Jak již naznačili ostatní v komentářích, aby to fungovalo s MongoDB, budete muset vytvořit výraz "ručně".
Pokud tedy vezmu následující prohlášení:
var data = db.Single<Demo>(d => d.prop1 == "value");
Domnívám se, že následující by mělo být ekvivalentní, ale ruční vytváření výrazu lambda:
string propname = "prop1"; // you can now change this to any valid property name.
var parameterExpresion = Expression.Parameter(typeof(Demo), "d");
var binaryExpression = Expression.Equal(
Expression.Property(parameterExpresion, propname),
Expression.Constant("value"));
var lambda = Expression.Lambda<Func<Demo, bool>>(binaryExpression, parameterExpresion);
var data = db.Single<Demo>(lambda);
... až na to, že nyní byste měli být schopni změnit hodnotu propname
na jakýkoli platný název vlastnosti a mělo by to fungovat.
Když se podívám na to, jak podrobný je kód při ručním sestavování lambd, opravdu mi pomáhá ocenit všechna ta kouzla kompilátoru, která se děje, aniž bychom si toho všimli.