(Dette var originalen, før man indså, at refleksion ikke ville hjælpe i dette særlige tilfælde. Se redigering nedenfor for opdateret svar)
Hvis du ikke har noget imod at bruge refleksion, kan du gøre:
var data = db.Single<Demo>(d => "value" == (string)typeof(Demo).GetProperty(propname).GetValue(d));
REDIGER
Som andre har antydet i kommentarerne, for at få dette til at fungere med MongoDB, skal du bygge udtrykket "i hånden".
Så hvis jeg tager følgende udsagn:
var data = db.Single<Demo>(d => d.prop1 == "value");
Jeg mener, at følgende burde være ækvivalent, men at bygge lambda-udtrykket i hånden:
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);
... bortset fra at du nu skulle være i stand til at ændre værdien af propname
til et hvilket som helst gyldigt ejendomsnavn, og det skulle bare fungere.
At se på, hvor omfattende koden bliver, når man bygger lambdaer manuelt, hjælper mig virkelig med at værdsætte al den kompilatormagi, der sker, uden at vi nogensinde bemærker det.