(Това беше оригиналът, предоставен преди да осъзнаем, че размисълът няма да помогне в този конкретен случай. Вижте редакцията по-долу за актуализиран отговор)
Ако нямате нищо против да използвате отражение, можете да направите:
var data = db.Single<Demo>(d => "value" == (string)typeof(Demo).GetProperty(propname).GetValue(d));
РЕДАКТИРАНЕ
Както други намекнаха в коментарите, за да работи това с MongoDB, ще трябва да създадете израза „на ръка“.
Така че, ако взема следното твърдение:
var data = db.Single<Demo>(d => d.prop1 == "value");
Вярвам, че следното трябва да е еквивалентно, но ламбда изразът се изгражда на ръка:
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);
... с изключение на това, че сега трябва да можете да промените стойността на propname
към всяко валидно име на свойство и просто трябва да работи.
Гледайки колко многословен става кодът, когато създавам ламбда ръчно, наистина ми помага да оценя цялата магия на компилатора, която се случва, без ние изобщо да забележим.